Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-1.1
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-1.1
Commits
4f3ee7be
Commit
4f3ee7be
authored
Oct 02, 2003
by
Gildas Bazin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* modules/codec/cinepak.c: ported the cinepak decoder to the new api.
parent
2f24327b
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
754 additions
and
87 deletions
+754
-87
configure.ac
configure.ac
+1
-2
modules/codec/Modules.am
modules/codec/Modules.am
+1
-0
modules/codec/cinepak.c
modules/codec/cinepak.c
+752
-0
modules/codec/cinepak/.cvsignore
modules/codec/cinepak/.cvsignore
+0
-11
modules/codec/cinepak/Modules.am
modules/codec/cinepak/Modules.am
+0
-4
modules/codec/cinepak/cinepak.h
modules/codec/cinepak/cinepak.h
+0
-70
No files found.
configure.ac
View file @
4f3ee7be
dnl Autoconf settings for vlc
dnl $Id: configure.ac,v 1.
79 2003/10/01 22:19:57
gbazin Exp $
dnl $Id: configure.ac,v 1.
80 2003/10/02 21:12:45
gbazin Exp $
AC_INIT(vlc,0.6.3-cvs)
...
...
@@ -3311,7 +3311,6 @@ AC_OUTPUT([
modules/codec/a52old/Makefile
modules/codec/a52old/downmix/Makefile
modules/codec/a52old/imdct/Makefile
modules/codec/cinepak/Makefile
modules/codec/faad/Makefile
modules/codec/ffmpeg/Makefile
modules/codec/ffmpeg/postprocessing/Makefile
...
...
modules/codec/Modules.am
View file @
4f3ee7be
SOURCES_a52 = a52.c
SOURCES_cinepak = cinepak.c
SOURCES_dts = dts.c
SOURCES_flacdec = flacdec.c
SOURCES_lpcm = lpcm.c
...
...
modules/codec/cinepak
/cinepak
.c
→
modules/codec/cinepak.c
View file @
4f3ee7be
...
...
@@ -2,7 +2,7 @@
* cinepak.c: cinepak video decoder
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
* $Id: cinepak.c,v 1.1
2 2003/09/02 20:19:2
5 gbazin Exp $
* $Id: cinepak.c,v 1.1
2003/10/02 21:12:4
5 gbazin Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
...
...
@@ -25,33 +25,68 @@
* Preamble
*****************************************************************************/
#include <stdlib.h>
/* malloc(), free() */
#include <string.h>
#include <vlc/vlc.h>
#include <vlc/vout.h>
#include <vlc/decoder.h>
#include <vlc/input.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
/* getpid() */
#endif
#define CINEPAK_MAXSTRIP 32
#include <errno.h>
#include <string.h>
typedef
struct
cinepak_codebook_s
{
u8
i_y
[
4
];
u8
i_u
,
i_v
;
}
cinepak_codebook_t
;
typedef
struct
cinepak_context_s
{
int
b_grayscale
;
/* force to grayscale */
int
i_width
;
int
i_height
;
int
i_stride_x
;
int
i_stride_y
;
u8
*
p_y
,
*
p_u
,
*
p_v
;
#ifdef HAVE_SYS_TIMES_H
# include <sys/times.h>
#endif
int
i_stride
[
3
];
/* our 3 planes */
int
i_lines
[
3
];
u8
*
p_pix
[
3
];
cinepak_codebook_t
codebook_v1
[
CINEPAK_MAXSTRIP
][
256
];
cinepak_codebook_t
codebook_v4
[
CINEPAK_MAXSTRIP
][
256
];
}
cinepak_context_t
;
/*****************************************************************************
* decoder_sys_t : decoder descriptor
*****************************************************************************/
struct
decoder_sys_t
{
/*
* Cinepak properties
*/
cinepak_context_t
*
p_context
;
#include "cinepak.h"
/*
* Output properties
*/
vout_thread_t
*
p_vout
;
};
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
int
OpenDecoder
(
vlc_object_t
*
);
static
int
RunDecoder
(
decoder_fifo_t
*
);
static
int
InitThread
(
videodec_thread_t
*
);
static
void
EndThread
(
videodec_thread_t
*
);
static
void
DecodeThread
(
videodec_thread_t
*
);
static
int
OpenDecoder
(
vlc_object_t
*
);
static
int
InitDecoder
(
decoder_t
*
);
static
int
RunDecoder
(
decoder_t
*
,
block_t
*
);
static
int
EndDecoder
(
decoder_t
*
);
static
int
cinepak_decode_frame
(
cinepak_context_t
*
,
int
,
u8
*
);
/*****************************************************************************
* Module descriptor
...
...
@@ -76,60 +111,152 @@ static int OpenDecoder( vlc_object_t *p_this )
{
case
VLC_FOURCC
(
'c'
,
'v'
,
'i'
,
'd'
):
case
VLC_FOURCC
(
'C'
,
'V'
,
'I'
,
'D'
):
p_dec
->
pf_run
=
RunDecoder
;
return
VLC_SUCCESS
;
break
;
default:
return
VLC_EGENERIC
;
}
return
VLC_EGENERIC
;
/* Allocate the memory needed to store the decoder's structure */
if
(
(
p_dec
->
p_sys
=
(
decoder_sys_t
*
)
malloc
(
sizeof
(
decoder_sys_t
))
)
==
NULL
)
{
msg_Err
(
p_dec
,
"out of memory"
);
return
VLC_EGENERIC
;
}
p_dec
->
pf_init
=
InitDecoder
;
p_dec
->
pf_decode
=
RunDecoder
;
p_dec
->
pf_end
=
EndDecoder
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
*
RunDecoder: this function is called just after the thread is created
*
InitDecoder: Initalize the decoder
*****************************************************************************/
static
int
RunDecoder
(
decoder_fifo_t
*
p_fifo
)
{
videodec_thread_t
*
p_vdec
;
int
b_error
;
if
(
!
(
p_vdec
=
(
videodec_thread_t
*
)
malloc
(
sizeof
(
videodec_thread_t
)))
)
static
int
InitDecoder
(
decoder_t
*
p_dec
)
{
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
vlc_value_t
val
;
p_sys
->
p_vout
=
NULL
;
if
(
!
(
p_sys
->
p_context
=
malloc
(
sizeof
(
cinepak_context_t
)
)
)
)
{
msg_Err
(
p_fifo
,
"out of memory"
);
DecoderError
(
p_fifo
);
return
(
-
1
);
msg_Err
(
p_dec
,
"out of memory"
);
}
memset
(
p_vdec
,
0
,
sizeof
(
videodec_thread_t
)
);
memset
(
p_sys
->
p_context
,
0
,
sizeof
(
cinepak_context_t
)
);
var_Create
(
p_dec
,
"grayscale"
,
VLC_VAR_BOOL
|
VLC_VAR_DOINHERIT
);
var_Get
(
p_dec
,
"grayscale"
,
&
val
);
p_sys
->
p_context
->
b_grayscale
=
val
.
b_bool
;
msg_Dbg
(
p_dec
,
"cinepak decoder started"
);
return
VLC_SUCCESS
;
}
p_vdec
->
p_fifo
=
p_fifo
;
/****************************************************************************
* RunDecoder: the whole thing
****************************************************************************
* This function must be fed with whole frames.
****************************************************************************/
static
int
RunDecoder
(
decoder_t
*
p_dec
,
block_t
*
p_block
)
{
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
int
i_status
,
i_plane
;
u8
*
p_dst
,
*
p_src
;
picture_t
*
p_pic
;
if
(
InitThread
(
p_vdec
)
!=
0
)
i_status
=
cinepak_decode_frame
(
p_sys
->
p_context
,
p_block
->
i_buffer
,
p_block
->
p_buffer
);
if
(
i_status
<
0
)
{
DecoderError
(
p_fifo
);
return
(
-
1
);
msg_Warn
(
p_dec
,
"cannot decode one frame (%d bytes)"
,
p_block
->
i_buffer
);
block_Release
(
p_block
);
return
VLC_SUCCESS
;
}
while
(
(
!
p_vdec
->
p_fifo
->
b_die
)
&&
(
!
p_vdec
->
p_fifo
->
b_error
)
)
/* Check our vout */
p_sys
->
p_vout
=
vout_Request
(
p_dec
,
p_sys
->
p_vout
,
p_sys
->
p_context
->
i_width
,
p_sys
->
p_context
->
i_height
,
VLC_FOURCC
(
'I'
,
'4'
,
'2'
,
'0'
),
p_sys
->
p_context
->
i_width
*
VOUT_ASPECT_FACTOR
/
p_sys
->
p_context
->
i_height
);
if
(
!
p_sys
->
p_vout
)
{
DecodeThread
(
p_vdec
);
msg_Err
(
p_dec
,
"cannot create vout"
);
block_Release
(
p_block
);
return
VLC_EGENERIC
;
}
if
(
(
b_error
=
p_vdec
->
p_fifo
->
b_error
)
)
/* Send decoded frame to vout */
while
(
!
(
p_pic
=
vout_CreatePicture
(
p_sys
->
p_vout
,
0
,
0
,
0
)
)
)
{
if
(
p_dec
->
p_fifo
->
b_die
||
p_dec
->
p_fifo
->
b_error
)
{
block_Release
(
p_block
);
return
VLC_EGENERIC
;
}
msleep
(
VOUT_OUTMEM_SLEEP
);
}
for
(
i_plane
=
0
;
i_plane
<
3
;
i_plane
++
)
{
DecoderError
(
p_vdec
->
p_fifo
);
int
i_line
,
i_lines
;
p_dst
=
p_pic
->
p
[
i_plane
].
p_pixels
;
p_src
=
p_sys
->
p_context
->
p_pix
[
i_plane
];
i_lines
=
__MIN
(
p_sys
->
p_context
->
i_lines
[
i_plane
],
p_pic
->
p
[
i_plane
].
i_lines
);
for
(
i_line
=
0
;
i_line
<
i_lines
;
i_line
++
)
{
memcpy
(
p_dst
,
p_src
,
__MIN
(
p_pic
->
p
[
i_plane
].
i_pitch
,
p_sys
->
p_context
->
i_stride
[
i_plane
]
)
);
p_dst
+=
p_pic
->
p
[
i_plane
].
i_pitch
;
p_src
+=
p_sys
->
p_context
->
i_stride
[
i_plane
];
}
}
EndThread
(
p_vdec
);
vout_DatePicture
(
p_sys
->
p_vout
,
p_pic
,
p_block
->
i_pts
);
vout_DisplayPicture
(
p_sys
->
p_vout
,
p_pic
);
block_Release
(
p_block
);
return
VLC_SUCCESS
;
}
/*****************************************************************************
* EndDecoder: theora decoder destruction
*****************************************************************************/
static
int
EndDecoder
(
decoder_t
*
p_dec
)
{
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
int
i
;
msg_Dbg
(
p_dec
,
"cinepak decoder stopped"
);
vout_Request
(
p_dec
,
p_sys
->
p_vout
,
0
,
0
,
0
,
0
);
if
(
b_error
)
for
(
i
=
0
;
i
<
3
;
i
++
)
{
return
(
-
1
);
if
(
p_sys
->
p_context
->
p_pix
[
i
]
)
free
(
p_sys
->
p_context
->
p_pix
[
i
]
);
}
return
(
0
);
}
free
(
p_sys
->
p_context
);
free
(
p_sys
);
return
VLC_SUCCESS
;
}
/*****************************************************************************
* local
es
Functions
* local Functions
*****************************************************************************/
#define GET2BYTES( p ) \
...
...
@@ -144,44 +271,8 @@ static int RunDecoder( decoder_fifo_t *p_fifo )
#define FREE( p ) \
if( p ) free( p )
static
void
GetPESData
(
u8
*
p_buf
,
int
i_max
,
pes_packet_t
*
p_pes
)
{
int
i_copy
;
int
i_count
;
data_packet_t
*
p_data
;
i_count
=
0
;
p_data
=
p_pes
->
p_first
;
while
(
p_data
!=
NULL
&&
i_count
<
i_max
)
{
i_copy
=
__MIN
(
p_data
->
p_payload_end
-
p_data
->
p_payload_start
,
i_max
-
i_count
);
if
(
i_copy
>
0
)
{
memcpy
(
p_buf
,
p_data
->
p_payload_start
,
i_copy
);
}
p_data
=
p_data
->
p_next
;
i_count
+=
i_copy
;
p_buf
+=
i_copy
;
}
if
(
i_count
<
i_max
)
{
memset
(
p_buf
,
0
,
i_max
-
i_count
);
}
}
void
cinepak_LoadCodebook
(
cinepak_codebook_t
*
p_codebook
,
u8
*
p_data
,
int
b_grayscale
)
static
void
cinepak_LoadCodebook
(
cinepak_codebook_t
*
p_codebook
,
u8
*
p_data
,
int
b_grayscale
)
{
int
i
,
i_y
[
4
],
i_u
,
i_v
,
i_Cb
,
i_Cr
;
int
i_uv
;
...
...
@@ -202,7 +293,7 @@ void cinepak_LoadCodebook( cinepak_codebook_t *p_codebook,
i_u
=
0
;
i_v
=
0
;
}
/*
| Y | | 1 -0.0655 0.0110 | | CY |
| Cb | = | 0 1.1656 -0.0062 | | CU |
...
...
@@ -215,34 +306,32 @@ void cinepak_LoadCodebook( cinepak_codebook_t *p_codebook,
}
i_Cb
=
(
FIX
(
1
.
1656
)
*
i_u
+
FIX
(
-
0
.
0062
)
*
i_v
)
>>
SCALEBITS
;
i_Cr
=
(
FIX
(
0
.
0467
)
*
i_u
+
FIX
(
1
.
4187
)
*
i_v
)
>>
SCALEBITS
;
for
(
i
=
0
;
i
<
4
;
i
++
)
{
p_codebook
->
i_y
[
i
]
=
__MIN
(
__MAX
(
0
,
i_y
[
i
]
),
255
);
}
p_codebook
->
i_u
=
__MIN
(
__MAX
(
0
,
i_Cb
+
128
),
255
);
p_codebook
->
i_v
=
__MIN
(
__MAX
(
0
,
i_Cr
+
128
),
255
);
#undef FIX
#undef SCALEBITS
}
void
cinepak_Getv4
(
cinepak_context_t
*
p_context
,
int
i_strip
,
int
i_x
,
int
i_y
,
int
i_x2
,
int
i_y2
,
u8
*
p_data
)
static
void
cinepak_Getv4
(
cinepak_context_t
*
p_context
,
int
i_strip
,
int
i_x
,
int
i_y
,
int
i_x2
,
int
i_y2
,
u8
*
p_data
)
{
u8
i_index
[
4
];
int
i
,
j
;
u8
*
p_dst_y
,
*
p_dst_u
,
*
p_dst_v
;
#define PIX_SET_Y( x, y, v ) \
p_dst_y[(x) + (y)* p_context->i_stride[0]] = (v);
#define PIX_SET_UV( i, p, x, y, v ) \
p[(x) + (y)* (p_context->i_stride[i])] = (v);
for
(
i
=
0
;
i
<
4
;
i
++
)
{
i_index
[
i
]
=
*
(
p_data
++
);
...
...
@@ -252,7 +341,7 @@ void cinepak_Getv4( cinepak_context_t *p_context,
p_dst_y
=
p_context
->
p_pix
[
0
]
+
p_context
->
i_stride
[
0
]
*
i_y
+
i_x
;
p_dst_u
=
p_context
->
p_pix
[
1
]
+
p_context
->
i_stride
[
1
]
*
(
i_y
/
2
)
+
(
i_x
/
2
);
p_dst_v
=
p_context
->
p_pix
[
2
]
+
p_context
->
i_stride
[
2
]
*
(
i_y
/
2
)
+
(
i_x
/
2
);
for
(
i
=
0
;
i
<
2
;
i
++
)
{
for
(
j
=
0
;
j
<
2
;
j
++
)
...
...
@@ -276,22 +365,20 @@ void cinepak_Getv4( cinepak_context_t *p_context,
#undef PIX_SET_UV
}
void
cinepak_Getv1
(
cinepak_context_t
*
p_context
,
int
i_strip
,
int
i_x
,
int
i_y
,
int
i_x2
,
int
i_y2
,
u8
*
p_data
)
static
void
cinepak_Getv1
(
cinepak_context_t
*
p_context
,
int
i_strip
,
int
i_x
,
int
i_y
,
int
i_x2
,
int
i_y2
,
u8
*
p_data
)
{
u8
i_index
;
int
i
,
j
;
u8
*
p_dst_y
,
*
p_dst_u
,
*
p_dst_v
;
#define PIX_SET_Y( x, y, v ) \
p_dst_y[(x) + (y)* p_context->i_stride[0]] = (v);
#define PIX_SET_UV( i,p, x, y, v ) \
p[(x) + (y)* (p_context->i_stride[i])] = (v);
i_index
=
*
(
p_data
++
);
/* y plane */
...
...
@@ -326,8 +413,8 @@ void cinepak_Getv1( cinepak_context_t *p_context,
/*****************************************************************************
* The function that decode one frame
*****************************************************************************/
int
cinepak_decode_frame
(
cinepak_context_t
*
p_context
,
int
i_length
,
u8
*
p_data
)
static
int
cinepak_decode_frame
(
cinepak_context_t
*
p_context
,
int
i_length
,
u8
*
p_data
)
{
int
i_strip
;
...
...
@@ -338,22 +425,28 @@ int cinepak_decode_frame( cinepak_context_t *p_context,
int
i_index
;
int
i_strip_x1
=
0
,
i_strip_y1
=
0
;
int
i_strip_x2
=
0
,
i_strip_y2
=
0
;
if
(
i_length
<=
10
)
{
/* Broken header or no data */
return
(
-
1
);
}
/* get header */
i_frame_flags
=
*
(
p_data
++
);
i_frame_size
=
GET3BYTES
(
p_data
);
i_width
=
GET2BYTES
(
p_data
);
i_height
=
GET2BYTES
(
p_data
);
i_frame_strips
=
GET2BYTES
(
p_data
);
if
(
!
i_frame_size
||
!
i_width
||
!
i_height
)
{
/* Broken header */
return
(
-
1
);
}
/* Check if we have a picture buffer with good size */
if
(
(
p_context
->
i_width
!=
i_width
)
||
if
(
(
p_context
->
i_width
!=
i_width
)
||
(
p_context
->
i_height
!=
i_height
)
)
{
int
i
;
...
...
@@ -365,14 +458,14 @@ int cinepak_decode_frame( cinepak_context_t *p_context,
p_context
->
i_width
=
i_width
;
p_context
->
i_height
=
i_height
;
p_context
->
i_stride
[
0
]
=
(
i_width
+
3
)
&
0xfffc
;
p_context
->
i_stride
[
0
]
=
(
i_width
+
3
)
&
0xfffc
;
p_context
->
i_stride
[
1
]
=
p_context
->
i_stride
[
2
]
=
p_context
->
i_stride
[
0
]
/
2
;
p_context
->
i_lines
[
0
]
=
(
i_height
+
3
)
&
0xfffc
;
p_context
->
i_lines
[
0
]
=
(
i_height
+
3
)
&
0xfffc
;
p_context
->
i_lines
[
1
]
=
p_context
->
i_lines
[
2
]
=
p_context
->
i_lines
[
0
]
/
2
;
for
(
i
=
0
;
i
<
3
;
i
++
)
{
p_context
->
p_pix
[
i
]
=
malloc
(
p_context
->
i_stride
[
i
]
*
...
...
@@ -395,7 +488,6 @@ int cinepak_decode_frame( cinepak_context_t *p_context,
}
/* Now decode each strip */
for
(
i_strip
=
0
;
i_strip
<
i_frame_strips
;
i_strip
++
)
{
int
i_strip_id
;
...
...
@@ -405,8 +497,7 @@ int cinepak_decode_frame( cinepak_context_t *p_context,
{
break
;
}
i_strip_id
=
GET2BYTES
(
p_data
);
i_strip_size
=
GET2BYTES
(
p_data
);
i_strip_size
=
__MIN
(
i_strip_size
,
i_length
);
...
...
@@ -448,7 +539,7 @@ int cinepak_decode_frame( cinepak_context_t *p_context,
i_chunk_size
=
GET2BYTES
(
p_data
);
i_chunk_size
=
__MIN
(
i_chunk_size
,
i_strip_size
);
i_strip_size
-=
i_chunk_size
;
i_chunk_size
-=
4
;
i_x
=
0
;
...
...
@@ -457,82 +548,142 @@ int cinepak_decode_frame( cinepak_context_t *p_context,
{
break
;
}
switch
(
i_chunk_id
)
{
case
(
0x2000
):
/* 12bits v4 Intra*/
case
(
0x2200
):
/* 12bits v1 Intra*/
case
(
0x2400
):
/* 8bits v4 Intra*/
case
(
0x2600
):
/* 8bits v1 Intra */
i_mode
=
(
(
i_chunk_id
&
0x0400
)
==
0
);
p_codebook
=
(
i_chunk_id
&
0x0200
)
?
&
p_context
->
codebook_v1
:
&
p_context
->
codebook_v4
;
i_count
=
__MIN
(
i_chunk_size
/
(
i_mode
?
6
:
4
),
256
);
for
(
i
=
0
;
i
<
i_count
;
i
++
)
case
(
0x2000
):
/* 12bits v4 Intra*/
case
(
0x2200
):
/* 12bits v1 Intra*/
case
(
0x2400
):
/* 8bits v4 Intra*/
case
(
0x2600
):
/* 8bits v1 Intra */
i_mode
=
(
(
i_chunk_id
&
0x0400
)
==
0
);
p_codebook
=
(
i_chunk_id
&
0x0200
)
?
&
p_context
->
codebook_v1
:
&
p_context
->
codebook_v4
;
i_count
=
__MIN
(
i_chunk_size
/
(
i_mode
?
6
:
4
),
256
);
for
(
i
=
0
;
i
<
i_count
;
i
++
)
{
cinepak_LoadCodebook
(
&
((
*
p_codebook
)[
i_strip
][
i
]),
p_data
,
i_mode
&~
p_context
->
b_grayscale
);
p_data
+=
i_mode
?
6
:
4
;
i_chunk_size
-=
i_mode
?
6
:
4
;
}
break
;
case
(
0x2100
):
/* selective 12bits v4 Inter*/
case
(
0x2300
):
/* selective 12bits v1 Inter*/
case
(
0x2500
):
/* selective 8bits v4 Inter*/
case
(
0x2700
):
/* selective 8bits v1 Inter*/
i_mode
=
(
(
i_chunk_id
&
0x0400
)
==
0
);
p_codebook
=
(
i_chunk_id
&
0x0200
)
?
&
p_context
->
codebook_v1
:
&
p_context
->
codebook_v4
;
i_index
=
0
;
while
(
(
i_chunk_size
>
4
)
&&
(
i_index
<
256
))
{
i_vector_flags
=
GET4BYTES
(
p_data
);
i_chunk_size
-=
4
;
for
(
i
=
0
;
i
<
32
;
i
++
)
{
cinepak_LoadCodebook
(
&
((
*
p_codebook
)[
i_strip
][
i
]),
p_data
,
i_mode
&~
p_context
->
b_grayscale
);
p_data
+=
i_mode
?
6
:
4
;
i_chunk_size
-=
i_mode
?
6
:
4
;
if
(
(
i_chunk_size
<
(
i_mode
?
6
:
4
)
)
||
(
i_index
>=
256
)
)
{
break
;
}
if
(
i_vector_flags
&
0x80000000UL
)
{
cinepak_LoadCodebook
(
&
((
*
p_codebook
)[
i_strip
][
i_index
]),
p_data
,
i_mode
&~
p_context
->
b_grayscale
);
p_data
+=
i_mode
?
6
:
4
;
i_chunk_size
-=
i_mode
?
6
:
4
;
}
i_index
++
;
i_vector_flags
<<=
1
;
}
break
;
case
(
0x2100
):
/* selective 12bits v4 Inter*/
case
(
0x2300
):
/* selective 12bits v1 Inter*/
case
(
0x2500
):
/* selective 8bits v4 Inter*/
case
(
0x2700
):
/* selective 8bits v1 Inter*/
i_mode
=
(
(
i_chunk_id
&
0x0400
)
==
0
);
p_codebook
=
(
i_chunk_id
&
0x0200
)
?
&
p_context
->
codebook_v1
:
&
p_context
->
codebook_v4
;
i_index
=
0
;
while
(
(
i_chunk_size
>
4
)
&&
(
i_index
<
256
))
}
break
;
case
(
0x3000
):
/* load image Intra */
while
(
(
i_chunk_size
>=
4
)
&&
(
i_y
<
i_strip_y2
-
i_strip_y1
)
)
{
i_vector_flags
=
GET4BYTES
(
p_data
);
i_chunk_size
-=
4
;
i_strip_size
-=
4
;
i_length
-=
4
;
for
(
i
=
0
;
i
<
32
;
i
++
)
{
i_vector_flags
=
GET4BYTES
(
p_data
);
i_chunk_size
-=
4
;
for
(
i
=
0
;
i
<
32
;
i
++
)
if
(
(
i_y
>=
i_strip_y2
-
i_strip_y1
)
||
(
i_chunk_size
<=
0
)
)
{
if
(
(
i_chunk_size
<
(
i_mode
?
6
:
4
)
)
||
(
i_index
>=
256
))
{
break
;
}
if
(
i_vector_flags
&
0x80000000UL
)
{
cinepak_LoadCodebook
(
&
((
*
p_codebook
)[
i_strip
][
i_index
]),
p_data
,
i_mode
&~
p_context
->
b_grayscale
);
break
;
}
if
(
i_vector_flags
&
0x80000000UL
)
{
cinepak_Getv4
(
p_context
,
i_strip
,
i_strip_x1
+
i_x
,
i_strip_y1
+
i_y
,
i_strip_x2
,
i_strip_y2
,
p_data
);
p_data
+=
4
;
i_chunk_size
-=
4
;
}
else
{
cinepak_Getv1
(
p_context
,
i_strip
,
i_strip_x1
+
i_x
,
i_strip_y1
+
i_y
,
i_strip_x2
,
i_strip_y2
,
p_data
);
p_data
++
;
i_chunk_size
--
;
}
p_data
+=
i_mode
?
6
:
4
;
i_chunk_size
-=
i_mode
?
6
:
4
;
}
i_
index
++
;
i_
vector_flags
<<=
1
;
i_x
+=
4
;
if
(
i_x
>=
i_strip_x2
-
i_strip_x1
)
{
i_
x
=
0
;
i_
y
+=
4
;
}
i_vector_flags
<<=
1
;
}
break
;
}
break
;
case
(
0x3000
):
/* load image Intra
*/
while
(
(
i_chunk_size
>=
4
)
&&
(
i_y
<
i_strip_y2
-
i_strip_y1
)
)
{
i_vector_flags
=
GET4BYTES
(
p_data
)
;
i_chunk_size
-=
4
;
i_strip
_size
-=
4
;
i_length
-=
4
;
case
(
0x3100
):
/* load image Inter
*/
while
(
(
i_chunk_size
>
4
)
&&
(
i_y
<
i_strip_y2
-
i_strip_y1
)
)
{
u32
i_mask
;
i_vector_flags
=
GET4BYTES
(
p_data
)
;
i_chunk
_size
-=
4
;
i_mask
=
0x80000000UL
;
for
(
i
=
0
;
i
<
32
;
i
++
)
while
(
(
i_chunk_size
>
0
)
&&
(
i_mask
)
&&
(
i_y
<
i_strip_y2
-
i_strip_y1
)
)
{
if
(
i_vector_flags
&
i_mask
)
{
i
f
(
(
i_y
>=
i_strip_y2
-
i_strip_y1
)
||
(
i_chunk_size
<=
0
)
)
i
_mask
>>=
1
;
if
(
!
i_mask
)
{
break
;
if
(
i_chunk_size
<
4
)
{
break
;
}
i_vector_flags
=
GET4BYTES
(
p_data
);
i_chunk_size
-=
4
;
i_mask
=
0x80000000UL
;
}
if
(
i_vector_flags
&
0x80000000UL
)
if
(
i_vector_flags
&
i_mask
)
{
if
(
i_chunk_size
<
4
)
break
;
cinepak_Getv4
(
p_context
,
i_strip
,
i_strip_x1
+
i_x
,
...
...
@@ -544,6 +695,7 @@ int cinepak_decode_frame( cinepak_context_t *p_context,
}
else
{
if
(
i_chunk_size
<
1
)
break
;
cinepak_Getv1
(
p_context
,
i_strip
,
i_strip_x1
+
i_x
,
...
...
@@ -553,90 +705,8 @@ int cinepak_decode_frame( cinepak_context_t *p_context,
p_data
++
;
i_chunk_size
--
;
}
i_x
+=
4
;
if
(
i_x
>=
i_strip_x2
-
i_strip_x1
)
{
i_x
=
0
;
i_y
+=
4
;
}
i_vector_flags
<<=
1
;
}
}
break
;
case
(
0x3100
):
/* load image Inter */
while
(
(
i_chunk_size
>
4
)
&&
(
i_y
<
i_strip_y2
-
i_strip_y1
)
)
{
u32
i_mask
;
i_vector_flags
=
GET4BYTES
(
p_data
);
i_chunk_size
-=
4
;
i_mask
=
0x80000000UL
;
while
((
i_chunk_size
>
0
)
&&
(
i_mask
)
&&
(
i_y
<
i_strip_y2
-
i_strip_y1
))
{
if
(
i_vector_flags
&
i_mask
)
{
i_mask
>>=
1
;
if
(
!
i_mask
)
{
if
(
i_chunk_size
<
4
)
{
break
;
}
i_vector_flags
=
GET4BYTES
(
p_data
);
i_chunk_size
-=
4
;
i_mask
=
0x80000000UL
;
}
if
(
i_vector_flags
&
i_mask
)
{
if
(
i_chunk_size
<
4
)
break
;
cinepak_Getv4
(
p_context
,
i_strip
,
i_strip_x1
+
i_x
,
i_strip_y1
+
i_y
,
i_strip_x2
,
i_strip_y2
,
p_data
);
p_data
+=
4
;
i_chunk_size
-=
4
;
}
else
{
if
(
i_chunk_size
<
1
)
break
;
cinepak_Getv1
(
p_context
,
i_strip
,
i_strip_x1
+
i_x
,
i_strip_y1
+
i_y
,
i_strip_x2
,
i_strip_y2
,
p_data
);
p_data
++
;
i_chunk_size
--
;
}
}
i_mask
>>=
1
;
i_x
+=
4
;
if
(
i_x
>=
i_strip_x2
-
i_strip_x1
)
{
i_x
=
0
;
i_y
+=
4
;
}
}
}
break
;
case
(
0x3200
):
/* load intra picture but all v1*/
while
(
(
i_chunk_size
>
0
)
&&
(
i_y
<
i_strip_y2
-
i_strip_y1
)
)
{
cinepak_Getv1
(
p_context
,
i_strip
,
i_strip_x1
+
i_x
,
i_strip_y1
+
i_y
,
i_strip_x2
,
i_strip_y2
,
p_data
);
p_data
++
;
i_chunk_size
--
;
i_mask
>>=
1
;
i_x
+=
4
;
if
(
i_x
>=
i_strip_x2
-
i_strip_x1
)
...
...
@@ -644,193 +714,39 @@ int cinepak_decode_frame( cinepak_context_t *p_context,
i_x
=
0
;
i_y
+=
4
;
}
}
break
;
}
}
break
;
case
(
0x3200
):
/* load intra picture but all v1*/
while
(
(
i_chunk_size
>
0
)
&&
(
i_y
<
i_strip_y2
-
i_strip_y1
)
)
{
cinepak_Getv1
(
p_context
,
i_strip
,
i_strip_x1
+
i_x
,
i_strip_y1
+
i_y
,
i_strip_x2
,
i_strip_y2
,
p_data
);
p_data
++
;
i_chunk_size
--
;
i_x
+=
4
;
if
(
i_x
>=
i_strip_x2
-
i_strip_x1
)
{
i_x
=
0
;
i_y
+=
4
;
}
}
break
;
default:
break
;
default:
break
;
}
p_data
+=
i_chunk_size
;
/* skip remains bytes */
}
}
return
(
0
);
}
/*****************************************************************************
*
* Functions that initialize, decode and end the decoding process
*
*****************************************************************************/
/*****************************************************************************
* InitThread: initialize vdec output thread
*****************************************************************************
* This function is called from decoder_Run and performs the second step
* of the initialization. It returns 0 on success. Note that the thread's
* flag are not modified inside this function.
*****************************************************************************/
static
int
InitThread
(
videodec_thread_t
*
p_vdec
)
{
/* This will be created after the first decoded frame */
if
(
!
(
p_vdec
->
p_context
=
malloc
(
sizeof
(
cinepak_context_t
)
)
)
)
{
msg_Err
(
p_vdec
->
p_fifo
,
"out of memory"
);
}
memset
(
p_vdec
->
p_context
,
0
,
sizeof
(
cinepak_context_t
)
);
if
(
config_GetInt
(
p_vdec
->
p_fifo
,
"grayscale"
)
)
{
p_vdec
->
p_context
->
b_grayscale
=
1
;
}
else
{
p_vdec
->
p_context
->
b_grayscale
=
0
;
}
p_vdec
->
p_vout
=
NULL
;
msg_Dbg
(
p_vdec
->
p_fifo
,
"cinepak decoder started"
);
return
(
0
);
}
/*****************************************************************************
* DecodeThread: Called for decode one frame
*****************************************************************************/
static
void
DecodeThread
(
videodec_thread_t
*
p_vdec
)
{
pes_packet_t
*
p_pes
;
int
i_frame_size
;
int
i_status
;
int
i_plane
;
u8
*
p_dst
,
*
p_src
;
picture_t
*
p_pic
;
/* videolan picture */
do
{
input_ExtractPES
(
p_vdec
->
p_fifo
,
&
p_pes
);
if
(
!
p_pes
)
{
p_vdec
->
p_fifo
->
b_error
=
1
;
return
;
}
p_vdec
->
i_pts
=
p_pes
->
i_pts
;
i_frame_size
=
p_pes
->
i_pes_size
;
if
(
i_frame_size
>
0
)
{
if
(
p_vdec
->
i_buffer
<
i_frame_size
+
16
)
{
FREE
(
p_vdec
->
p_buffer
);
p_vdec
->
p_buffer
=
malloc
(
i_frame_size
+
16
);
p_vdec
->
i_buffer
=
i_frame_size
+
16
;
}
GetPESData
(
p_vdec
->
p_buffer
,
p_vdec
->
i_buffer
,
p_pes
);
}
input_DeletePES
(
p_vdec
->
p_fifo
->
p_packets_mgt
,
p_pes
);
}
while
(
i_frame_size
<=
0
);
i_status
=
cinepak_decode_frame
(
p_vdec
->
p_context
,
i_frame_size
,
p_vdec
->
p_buffer
);
if
(
i_status
<
0
)
{
msg_Warn
(
p_vdec
->
p_fifo
,
"cannot decode one frame (%d bytes)"
,
i_frame_size
);
return
;
}
/* Check our vout */
p_vdec
->
p_vout
=
vout_Request
(
p_vdec
->
p_fifo
,
p_vdec
->
p_vout
,
p_vdec
->
p_context
->
i_width
,
p_vdec
->
p_context
->
i_height
,
VLC_FOURCC
(
'I'
,
'4'
,
'2'
,
'0'
),
p_vdec
->
p_context
->
i_width
*
VOUT_ASPECT_FACTOR
/
p_vdec
->
p_context
->
i_height
);
if
(
!
p_vdec
->
p_vout
)
{
msg_Err
(
p_vdec
->
p_fifo
,
"cannot create vout"
);
p_vdec
->
p_fifo
->
b_error
=
VLC_TRUE
;
/* abort */
return
;
}
/* Send decoded frame to vout */
while
(
!
(
p_pic
=
vout_CreatePicture
(
p_vdec
->
p_vout
,
0
,
0
,
0
)
)
)
{
if
(
p_vdec
->
p_fifo
->
b_die
||
p_vdec
->
p_fifo
->
b_error
)
{
return
;
}
msleep
(
VOUT_OUTMEM_SLEEP
);
}
for
(
i_plane
=
0
;
i_plane
<
3
;
i_plane
++
)
{
int
i_line
,
i_lines
;
p_dst
=
p_pic
->
p
[
i_plane
].
p_pixels
;
p_src
=
p_vdec
->
p_context
->
p_pix
[
i_plane
];
i_lines
=
__MIN
(
p_vdec
->
p_context
->
i_lines
[
i_plane
],
p_pic
->
p
[
i_plane
].
i_lines
);
for
(
i_line
=
0
;
i_line
<
i_lines
;
i_line
++
)
{
memcpy
(
p_dst
,
p_src
,
__MIN
(
p_pic
->
p
[
i_plane
].
i_pitch
,
p_vdec
->
p_context
->
i_stride
[
i_plane
]
)
);
p_dst
+=
p_pic
->
p
[
i_plane
].
i_pitch
;
p_src
+=
p_vdec
->
p_context
->
i_stride
[
i_plane
];
}
}
vout_DatePicture
(
p_vdec
->
p_vout
,
p_pic
,
p_vdec
->
i_pts
);
vout_DisplayPicture
(
p_vdec
->
p_vout
,
p_pic
);
return
;
}
/*****************************************************************************
* EndThread: thread destruction
*****************************************************************************
* This function is called when the thread ends after a sucessful
* initialization.
*****************************************************************************/
static
void
EndThread
(
videodec_thread_t
*
p_vdec
)
{
int
i
;
if
(
!
p_vdec
)
{
return
;
}
msg_Dbg
(
p_vdec
->
p_fifo
,
"cinepak decoder stopped"
);
for
(
i
=
0
;
i
<
3
;
i
++
)
{
FREE
(
p_vdec
->
p_context
->
p_pix
[
i
]
);
}
free
(
p_vdec
->
p_context
);
/* Get rid of our video output if we have one. */
vout_Request
(
p_vdec
->
p_fifo
,
p_vdec
->
p_vout
,
0
,
0
,
0
,
0
);
free
(
p_vdec
);
}
modules/codec/cinepak/.cvsignore
deleted
100644 → 0
View file @
2f24327b
.deps
.dirstamp
*.lo
*.la
*.dll
*.dylib
*.sl
*.so
Makefile.am
Makefile.in
Makefile
modules/codec/cinepak/Modules.am
deleted
100644 → 0
View file @
2f24327b
SOURCES_cinepak = \
cinepak.c \
cinepak.h \
$(NULL)
modules/codec/cinepak/cinepak.h
deleted
100644 → 0
View file @
2f24327b
/*****************************************************************************
* cinepak.h: Cinepak video decoder
*****************************************************************************
* Copyright (C) 2001 VideoLAN
* $Id: cinepak.h,v 1.2 2002/11/27 13:17:27 fenrir Exp $
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
#define CINEPAK_MAXSTRIP 32
typedef
struct
cinepak_codebook_s
{
u8
i_y
[
4
];
u8
i_u
,
i_v
;
}
cinepak_codebook_t
;
typedef
struct
cinepak_context_s
{
int
b_grayscale
;
/* force to grayscale */
int
i_width
;
int
i_height
;
int
i_stride_x
;
int
i_stride_y
;
u8
*
p_y
,
*
p_u
,
*
p_v
;
int
i_stride
[
3
];
/* our 3 planes */
int
i_lines
[
3
];
u8
*
p_pix
[
3
];
cinepak_codebook_t
codebook_v1
[
CINEPAK_MAXSTRIP
][
256
];
cinepak_codebook_t
codebook_v4
[
CINEPAK_MAXSTRIP
][
256
];
}
cinepak_context_t
;
typedef
struct
videodec_thread_s
{
decoder_fifo_t
*
p_fifo
;
vout_thread_t
*
p_vout
;
cinepak_context_t
*
p_context
;
/* private */
mtime_t
i_pts
;
u8
*
p_buffer
;
/* buffer for gather pes */
\
int
i_buffer
;
/* size of allocated p_framedata */
// int i_framesize;
// byte_t *p_framedata;
}
videodec_thread_t
;
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment