FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
mpeg12.c
Go to the documentation of this file.
1
/*
2
* MPEG-1/2 decoder
3
* Copyright (c) 2000, 2001 Fabrice Bellard
4
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5
*
6
* This file is part of FFmpeg.
7
*
8
* FFmpeg is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2.1 of the License, or (at your option) any later version.
12
*
13
* FFmpeg is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
17
*
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with FFmpeg; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*/
22
23
/**
24
* @file
25
* MPEG-1/2 decoder
26
*/
27
28
#define UNCHECKED_BITSTREAM_READER 1
29
30
#include "
libavutil/attributes.h
"
31
#include "
libavutil/avassert.h
"
32
#include "
libavutil/timecode.h
"
33
34
#include "
internal.h
"
35
#include "
avcodec.h
"
36
#include "
dsputil.h
"
37
#include "
mpegvideo.h
"
38
#include "
error_resilience.h
"
39
#include "
mpeg12.h
"
40
#include "
mpeg12data.h
"
41
#include "
mpeg12decdata.h
"
42
#include "
bytestream.h
"
43
#include "
vdpau_internal.h
"
44
#include "
xvmc_internal.h
"
45
#include "
thread.h
"
46
47
uint8_t
ff_mpeg12_static_rl_table_store
[2][2][2*
MAX_RUN
+
MAX_LEVEL
+ 3];
48
49
#define INIT_2D_VLC_RL(rl, static_size)\
50
{\
51
static RL_VLC_ELEM rl_vlc_table[static_size];\
52
INIT_VLC_STATIC(&rl.vlc, TEX_VLC_BITS, rl.n + 2,\
53
&rl.table_vlc[0][1], 4, 2,\
54
&rl.table_vlc[0][0], 4, 2, static_size);\
55
\
56
rl.rl_vlc[0] = rl_vlc_table;\
57
init_2d_vlc_rl(&rl);\
58
}
59
60
static
av_cold
void
init_2d_vlc_rl
(
RLTable
*rl)
61
{
62
int
i;
63
64
for
(i = 0; i < rl->
vlc
.
table_size
; i++) {
65
int
code = rl->
vlc
.
table
[i][0];
66
int
len
= rl->
vlc
.
table
[i][1];
67
int
level
,
run
;
68
69
if
(len == 0) {
// illegal code
70
run = 65;
71
level =
MAX_LEVEL
;
72
}
else
if
(len<0) {
//more bits needed
73
run = 0;
74
level = code;
75
}
else
{
76
if
(code == rl->
n
) {
//esc
77
run = 65;
78
level = 0;
79
}
else
if
(code == rl->
n
+1) {
//eob
80
run = 0;
81
level = 127;
82
}
else
{
83
run = rl->
table_run
[code] + 1;
84
level = rl->
table_level
[code];
85
}
86
}
87
rl->
rl_vlc
[0][i].
len
=
len
;
88
rl->
rl_vlc
[0][i].
level
=
level
;
89
rl->
rl_vlc
[0][i].
run
=
run
;
90
}
91
}
92
93
av_cold
void
ff_mpeg12_common_init
(
MpegEncContext
*
s
)
94
{
95
96
s->
y_dc_scale_table
=
97
s->
c_dc_scale_table
=
ff_mpeg2_dc_scale_table
[s->
intra_dc_precision
];
98
99
}
100
101
void
ff_mpeg1_clean_buffers
(
MpegEncContext
*
s
)
102
{
103
s->
last_dc
[0] = 1 << (7 + s->
intra_dc_precision
);
104
s->
last_dc
[1] = s->
last_dc
[0];
105
s->
last_dc
[2] = s->
last_dc
[0];
106
memset(s->
last_mv
, 0,
sizeof
(s->
last_mv
));
107
}
108
109
110
/******************************************/
111
/* decoding */
112
113
VLC
ff_mv_vlc
;
114
115
VLC
ff_dc_lum_vlc
;
116
VLC
ff_dc_chroma_vlc
;
117
118
VLC
ff_mbincr_vlc
;
119
VLC
ff_mb_ptype_vlc
;
120
VLC
ff_mb_btype_vlc
;
121
VLC
ff_mb_pat_vlc
;
122
123
av_cold
void
ff_mpeg12_init_vlcs
(
void
)
124
{
125
static
int
done = 0;
126
127
if
(!done) {
128
done = 1;
129
130
INIT_VLC_STATIC
(&ff_dc_lum_vlc,
DC_VLC_BITS
, 12,
131
ff_mpeg12_vlc_dc_lum_bits
, 1, 1,
132
ff_mpeg12_vlc_dc_lum_code
, 2, 2, 512);
133
INIT_VLC_STATIC
(&ff_dc_chroma_vlc,
DC_VLC_BITS
, 12,
134
ff_mpeg12_vlc_dc_chroma_bits
, 1, 1,
135
ff_mpeg12_vlc_dc_chroma_code
, 2, 2, 514);
136
INIT_VLC_STATIC
(&ff_mv_vlc,
MV_VLC_BITS
, 17,
137
&
ff_mpeg12_mbMotionVectorTable
[0][1], 2, 1,
138
&
ff_mpeg12_mbMotionVectorTable
[0][0], 2, 1, 518);
139
INIT_VLC_STATIC
(&ff_mbincr_vlc,
MBINCR_VLC_BITS
, 36,
140
&
ff_mpeg12_mbAddrIncrTable
[0][1], 2, 1,
141
&
ff_mpeg12_mbAddrIncrTable
[0][0], 2, 1, 538);
142
INIT_VLC_STATIC
(&ff_mb_pat_vlc,
MB_PAT_VLC_BITS
, 64,
143
&
ff_mpeg12_mbPatTable
[0][1], 2, 1,
144
&
ff_mpeg12_mbPatTable
[0][0], 2, 1, 512);
145
146
INIT_VLC_STATIC
(&ff_mb_ptype_vlc,
MB_PTYPE_VLC_BITS
, 7,
147
&
table_mb_ptype
[0][1], 2, 1,
148
&
table_mb_ptype
[0][0], 2, 1, 64);
149
INIT_VLC_STATIC
(&ff_mb_btype_vlc,
MB_BTYPE_VLC_BITS
, 11,
150
&
table_mb_btype
[0][1], 2, 1,
151
&
table_mb_btype
[0][0], 2, 1, 64);
152
ff_init_rl
(&
ff_rl_mpeg1
,
ff_mpeg12_static_rl_table_store
[0]);
153
ff_init_rl
(&
ff_rl_mpeg2
,
ff_mpeg12_static_rl_table_store
[1]);
154
155
INIT_2D_VLC_RL
(
ff_rl_mpeg1
, 680);
156
INIT_2D_VLC_RL
(
ff_rl_mpeg2
, 674);
157
}
158
}
159
160
/**
161
* Find the end of the current frame in the bitstream.
162
* @return the position of the first byte of the next frame, or -1
163
*/
164
int
ff_mpeg1_find_frame_end
(
ParseContext
*pc,
const
uint8_t
*
buf
,
int
buf_size,
AVCodecParserContext
*
s
)
165
{
166
int
i;
167
uint32_t
state
= pc->
state
;
168
169
/* EOF considered as end of frame */
170
if
(buf_size == 0)
171
return
0;
172
173
/*
174
0 frame start -> 1/4
175
1 first_SEQEXT -> 0/2
176
2 first field start -> 3/0
177
3 second_SEQEXT -> 2/0
178
4 searching end
179
*/
180
181
for
(i = 0; i < buf_size; i++) {
182
av_assert1
(pc->
frame_start_found
>= 0 && pc->
frame_start_found
<= 4);
183
if
(pc->
frame_start_found
& 1) {
184
if
(state ==
EXT_START_CODE
&& (buf[i] & 0xF0) != 0x80)
185
pc->
frame_start_found
--;
186
else
if
(state ==
EXT_START_CODE
+ 2) {
187
if
((buf[i] & 3) == 3)
188
pc->
frame_start_found
= 0;
189
else
190
pc->
frame_start_found
= (pc->
frame_start_found
+ 1) & 3;
191
}
192
state++;
193
}
else
{
194
i =
avpriv_find_start_code
(buf + i, buf + buf_size, &state) - buf - 1;
195
if
(pc->
frame_start_found
== 0 && state >=
SLICE_MIN_START_CODE
&& state <=
SLICE_MAX_START_CODE
) {
196
i++;
197
pc->
frame_start_found
= 4;
198
}
199
if
(state ==
SEQ_END_CODE
) {
200
pc->
frame_start_found
= 0;
201
pc->
state
=-1;
202
return
i+1;
203
}
204
if
(pc->
frame_start_found
== 2 && state ==
SEQ_START_CODE
)
205
pc->
frame_start_found
= 0;
206
if
(pc->
frame_start_found
< 4 && state ==
EXT_START_CODE
)
207
pc->
frame_start_found
++;
208
if
(pc->
frame_start_found
== 4 && (state & 0xFFFFFF00) == 0x100) {
209
if
(state < SLICE_MIN_START_CODE || state >
SLICE_MAX_START_CODE
) {
210
pc->
frame_start_found
= 0;
211
pc->
state
= -1;
212
return
i - 3;
213
}
214
}
215
if
(pc->
frame_start_found
== 0 && s && state ==
PICTURE_START_CODE
) {
216
ff_fetch_timestamp
(s, i - 3, 1);
217
}
218
}
219
}
220
pc->
state
=
state
;
221
return
END_NOT_FOUND
;
222
}
223
Generated on Wed Jul 10 2013 23:48:01 for FFmpeg by
1.8.2