2 * MPEG1 codec / MPEG2 decoder
3 * Copyright (c) 2000,2001 Fabrice Bellard.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
28 #include "mpegvideo.h"
30 #include "mpeg12data.h"
34 #define SEQ_END_CODE 0x000001b7
35 #define SEQ_START_CODE 0x000001b3
36 #define GOP_START_CODE 0x000001b8
37 #define PICTURE_START_CODE 0x00000100
38 #define SLICE_MIN_START_CODE 0x00000101
39 #define SLICE_MAX_START_CODE 0x000001af
40 #define EXT_START_CODE 0x000001b5
41 #define USER_START_CODE 0x000001b2
45 #define MBINCR_VLC_BITS 9
46 #define MB_PAT_VLC_BITS 9
47 #define MB_PTYPE_VLC_BITS 6
48 #define MB_BTYPE_VLC_BITS 6
49 #define TEX_VLC_BITS 9
51 #ifdef CONFIG_ENCODERS
52 static void mpeg1_encode_block(MpegEncContext
*s
,
55 static void mpeg1_encode_motion(MpegEncContext
*s
, int val
, int f_or_b_code
); // RAL: f_code parameter added
56 #endif //CONFIG_ENCODERS
57 static void mpeg1_skip_picture(MpegEncContext
*s
, int pict_num
);
58 static inline int mpeg1_decode_block_inter(MpegEncContext
*s
,
61 static inline int mpeg1_decode_block_intra(MpegEncContext
*s
,
64 static inline int mpeg2_decode_block_non_intra(MpegEncContext
*s
,
67 static inline int mpeg2_decode_block_intra(MpegEncContext
*s
,
70 static int mpeg_decode_motion(MpegEncContext
*s
, int fcode
, int pred
);
73 extern int XVMC_field_start(MpegEncContext
*s
, AVCodecContext
*avctx
);
74 extern int XVMC_field_end(MpegEncContext
*s
);
77 #ifdef CONFIG_ENCODERS
78 static uint8_t (*mv_penalty
)[MAX_MV
*2+1]= NULL
;
79 static uint8_t fcode_tab
[MAX_MV
*2+1];
81 static uint32_t uni_mpeg1_ac_vlc_bits
[64*64*2];
82 static uint8_t uni_mpeg1_ac_vlc_len
[64*64*2];
84 /* simple include everything table for dc, first byte is bits number next 3 are code*/
85 static uint32_t mpeg1_lum_dc_uni
[512];
86 static uint32_t mpeg1_chr_dc_uni
[512];
88 static uint8_t mpeg1_index_run
[2][64];
89 static int8_t mpeg1_max_level
[2][64];
90 #endif //CONFIG_ENCODERS
92 static void init_2d_vlc_rl(RLTable
*rl
)
96 init_vlc(&rl
->vlc
, TEX_VLC_BITS
, rl
->n
+ 2,
97 &rl
->table_vlc
[0][1], 4, 2,
98 &rl
->table_vlc
[0][0], 4, 2);
101 rl
->rl_vlc
[0]= av_malloc(rl
->vlc
.table_size
*sizeof(RL_VLC_ELEM
));
102 for(i
=0; i
<rl
->vlc
.table_size
; i
++){
103 int code
= rl
->vlc
.table
[i
][0];
104 int len
= rl
->vlc
.table
[i
][1];
107 if(len
==0){ // illegal code
110 }else if(len
<0){ //more bits needed
114 if(code
==rl
->n
){ //esc
117 }else if(code
==rl
->n
+1){ //eob
121 run
= rl
->table_run
[code
] + 1;
122 level
= rl
->table_level
[code
];
125 rl
->rl_vlc
[0][i
].len
= len
;
126 rl
->rl_vlc
[0][i
].level
= level
;
127 rl
->rl_vlc
[0][i
].run
= run
;
131 #ifdef CONFIG_ENCODERS
132 static void init_uni_ac_vlc(RLTable
*rl
, uint32_t *uni_ac_vlc_bits
, uint8_t *uni_ac_vlc_len
){
135 for(i
=0; i
<128; i
++){
138 for(run
=0; run
<64; run
++){
141 int alevel
= ABS(level
);
142 int sign
= (level
>>31)&1;
144 if (alevel
> rl
->max_level
[0][run
])
147 code
= rl
->index_run
[0][run
] + alevel
- 1;
149 if (code
< 111 /* rl->n */) {
150 /* store the vlc & sign at once */
151 len
= mpeg1_vlc
[code
][1]+1;
152 bits
= (mpeg1_vlc
[code
][0]<<1) + sign
;
154 len
= mpeg1_vlc
[111/*rl->n*/][1]+6;
155 bits
= mpeg1_vlc
[111/*rl->n*/][0]<<6;
165 bits
|= 0x8001 + level
+ 255;
167 bits
|= level
& 0xffff;
172 uni_ac_vlc_bits
[UNI_AC_ENC_INDEX(run
, i
)]= bits
;
173 uni_ac_vlc_len
[UNI_AC_ENC_INDEX(run
, i
)]= len
;
178 static void put_header(MpegEncContext
*s
, int header
)
180 align_put_bits(&s
->pb
);
181 put_bits(&s
->pb
, 16, header
>>16);
182 put_bits(&s
->pb
, 16, header
&0xFFFF);
185 /* put sequence header if needed */
186 static void mpeg1_encode_sequence_header(MpegEncContext
*s
)
188 unsigned int vbv_buffer_size
;
192 float best_aspect_error
= 1E10
;
193 float aspect_ratio
= av_q2d(s
->avctx
->sample_aspect_ratio
);
194 int constraint_parameter_flag
;
196 if(aspect_ratio
==0.0) aspect_ratio
= 1.0; //pixel aspect 1:1 (VGA)
198 if (s
->current_picture
.key_frame
) {
199 /* mpeg1 header repeated every gop */
200 put_header(s
, SEQ_START_CODE
);
202 /* search closest frame rate */
205 s
->frame_rate_index
= 0;
208 if(s
->avctx
->strict_std_compliance
>= 0 && i
>=9) break;
210 d
= abs(MPEG1_FRAME_RATE_BASE
*(int64_t)s
->avctx
->frame_rate
/s
->avctx
->frame_rate_base
- frame_rate_tab
[i
]);
213 s
->frame_rate_index
= i
;
218 put_bits(&s
->pb
, 12, s
->width
);
219 put_bits(&s
->pb
, 12, s
->height
);
222 float error
= mpeg1_aspect
[i
] - aspect_ratio
;
225 if(error
< best_aspect_error
){
226 best_aspect_error
= error
;
227 s
->aspect_ratio_info
= i
;
231 put_bits(&s
->pb
, 4, s
->aspect_ratio_info
);
232 put_bits(&s
->pb
, 4, s
->frame_rate_index
);
234 if(s
->avctx
->rc_max_rate
){
235 v
= (s
->avctx
->rc_max_rate
+ 399) / 400;
236 if (v
> 0x3ffff && s
->codec_id
== CODEC_ID_MPEG1VIDEO
)
242 if(s
->avctx
->rc_buffer_size
)
243 vbv_buffer_size
= s
->avctx
->rc_buffer_size
;
245 /* VBV calculation: Scaled so that a VCD has the proper VBV size of 40 kilobytes */
246 vbv_buffer_size
= (( 20 * s
->bit_rate
) / (1151929 / 2)) * 8 * 1024;
247 vbv_buffer_size
= (vbv_buffer_size
+ 16383) / 16384;
249 put_bits(&s
->pb
, 18, v
& 0x3FFFF);
250 put_bits(&s
->pb
, 1, 1); /* marker */
251 put_bits(&s
->pb
, 10, vbv_buffer_size
& 0x3FF);
253 constraint_parameter_flag
=
254 s
->width
<= 768 && s
->height
<= 576 &&
255 s
->mb_width
* s
->mb_height
<= 396 &&
256 s
->mb_width
* s
->mb_height
* frame_rate_tab
[s
->frame_rate_index
] <= MPEG1_FRAME_RATE_BASE
*396*25 &&
257 frame_rate_tab
[s
->frame_rate_index
] <= MPEG1_FRAME_RATE_BASE
*30 &&
258 vbv_buffer_size
<= 20 &&
260 s
->codec_id
== CODEC_ID_MPEG1VIDEO
;
262 put_bits(&s
->pb
, 1, constraint_parameter_flag
);
264 ff_write_quant_matrix(&s
->pb
, s
->avctx
->intra_matrix
);
265 ff_write_quant_matrix(&s
->pb
, s
->avctx
->inter_matrix
);
267 if(s
->codec_id
== CODEC_ID_MPEG2VIDEO
){
268 put_header(s
, EXT_START_CODE
);
269 put_bits(&s
->pb
, 4, 1); //seq ext
270 put_bits(&s
->pb
, 1, 0); //esc
271 put_bits(&s
->pb
, 3, 4); //profile
272 put_bits(&s
->pb
, 4, 8); //level
273 put_bits(&s
->pb
, 1, s
->progressive_sequence
=1);
274 put_bits(&s
->pb
, 2, 1); //chroma format 4:2:0
275 put_bits(&s
->pb
, 2, 0); //horizontal size ext
276 put_bits(&s
->pb
, 2, 0); //vertical size ext
277 put_bits(&s
->pb
, 12, v
>>18); //bitrate ext
278 put_bits(&s
->pb
, 1, 1); //marker
279 put_bits(&s
->pb
, 8, vbv_buffer_size
>>10); //vbv buffer ext
280 put_bits(&s
->pb
, 1, s
->low_delay
);
281 put_bits(&s
->pb
, 2, 0); // frame_rate_ext_n
282 put_bits(&s
->pb
, 5, 0); // frame_rate_ext_d
285 put_header(s
, GOP_START_CODE
);
286 put_bits(&s
->pb
, 1, 0); /* do drop frame */
287 /* time code : we must convert from the real frame rate to a
288 fake mpeg frame rate in case of low frame rate */
289 fps
= frame_rate_tab
[s
->frame_rate_index
];
290 time_code
= (int64_t)s
->fake_picture_number
* MPEG1_FRAME_RATE_BASE
;
291 s
->gop_picture_number
= s
->fake_picture_number
;
292 put_bits(&s
->pb
, 5, (uint32_t)((time_code
/ (fps
* 3600)) % 24));
293 put_bits(&s
->pb
, 6, (uint32_t)((time_code
/ (fps
* 60)) % 60));
294 put_bits(&s
->pb
, 1, 1);
295 put_bits(&s
->pb
, 6, (uint32_t)((time_code
/ fps
) % 60));
296 put_bits(&s
->pb
, 6, (uint32_t)((time_code
% fps
) / MPEG1_FRAME_RATE_BASE
));
297 put_bits(&s
->pb
, 1, 0); /* closed gop */
298 put_bits(&s
->pb
, 1, 0); /* broken link */
301 if (s
->avctx
->frame_rate
< (24 * s
->avctx
->frame_rate_base
) && s
->picture_number
> 0) {
302 /* insert empty P pictures to slow down to the desired
303 frame rate. Each fake pictures takes about 20 bytes */
304 fps
= frame_rate_tab
[s
->frame_rate_index
];
305 n
= av_rescale((int64_t)s
->picture_number
* s
->avctx
->frame_rate_base
, fps
, s
->avctx
->frame_rate
) / MPEG1_FRAME_RATE_BASE
- 1;
306 while (s
->fake_picture_number
< n
) {
307 mpeg1_skip_picture(s
, s
->fake_picture_number
-
308 s
->gop_picture_number
);
309 s
->fake_picture_number
++;
315 static inline void encode_mb_skip_run(MpegEncContext
*s
, int run
){
317 put_bits(&s
->pb
, 11, 0x008);
320 put_bits(&s
->pb
, mbAddrIncrTable
[run
][1],
321 mbAddrIncrTable
[run
][0]);
324 /* insert a fake P picture */
325 static void mpeg1_skip_picture(MpegEncContext
*s
, int pict_num
)
327 assert(s
->codec_id
== CODEC_ID_MPEG1VIDEO
); // mpeg2 can do these repeat things
329 /* mpeg1 picture header */
330 put_header(s
, PICTURE_START_CODE
);
331 /* temporal reference */
332 put_bits(&s
->pb
, 10, pict_num
& 0x3ff);
334 put_bits(&s
->pb
, 3, P_TYPE
);
335 put_bits(&s
->pb
, 16, 0xffff); /* non constant bit rate */
337 put_bits(&s
->pb
, 1, 1); /* integer coordinates */
338 put_bits(&s
->pb
, 3, 1); /* forward_f_code */
340 put_bits(&s
->pb
, 1, 0); /* extra bit picture */
343 put_header(s
, SLICE_MIN_START_CODE
);
344 put_bits(&s
->pb
, 5, 1); /* quantizer scale */
345 put_bits(&s
->pb
, 1, 0); /* slice extra information */
347 encode_mb_skip_run(s
, 0);
349 /* empty macroblock */
350 put_bits(&s
->pb
, 3, 1); /* motion only */
352 /* zero motion x & y */
353 put_bits(&s
->pb
, 1, 1);
354 put_bits(&s
->pb
, 1, 1);
356 /* output a number of empty slice */
357 encode_mb_skip_run(s
, s
->mb_width
* s
->mb_height
- 2);
359 /* empty macroblock */
360 put_bits(&s
->pb
, 3, 1); /* motion only */
362 /* zero motion x & y */
363 put_bits(&s
->pb
, 1, 1);
364 put_bits(&s
->pb
, 1, 1);
366 #endif //CONFIG_ENCODERS
368 static void common_init(MpegEncContext
*s
)
371 s
->c_dc_scale_table
= ff_mpeg1_dc_scale_table
;
374 void ff_mpeg1_clean_buffers(MpegEncContext
*s
){
375 s
->last_dc
[0] = 1 << (7 + s
->intra_dc_precision
);
376 s
->last_dc
[1] = s
->last_dc
[0];
377 s
->last_dc
[2] = s
->last_dc
[0];
378 memset(s
->last_mv
, 0, sizeof(s
->last_mv
));
381 #ifdef CONFIG_ENCODERS
383 void ff_mpeg1_encode_slice_header(MpegEncContext
*s
){
384 put_header(s
, SLICE_MIN_START_CODE
+ s
->mb_y
);
385 put_bits(&s
->pb
, 5, s
->qscale
); /* quantizer scale */
386 put_bits(&s
->pb
, 1, 0); /* slice extra information */
389 void mpeg1_encode_picture_header(MpegEncContext
*s
, int picture_number
)
391 mpeg1_encode_sequence_header(s
);
393 /* mpeg1 picture header */
394 put_header(s
, PICTURE_START_CODE
);
395 /* temporal reference */
397 // RAL: s->picture_number instead of s->fake_picture_number
398 put_bits(&s
->pb
, 10, (s
->picture_number
-
399 s
->gop_picture_number
) & 0x3ff);
400 s
->fake_picture_number
++;
402 put_bits(&s
->pb
, 3, s
->pict_type
);
403 put_bits(&s
->pb
, 16, 0xffff); /* non constant bit rate */
405 // RAL: Forward f_code also needed for B frames
406 if (s
->pict_type
== P_TYPE
|| s
->pict_type
== B_TYPE
) {
407 put_bits(&s
->pb
, 1, 0); /* half pel coordinates */
408 if(s
->codec_id
== CODEC_ID_MPEG1VIDEO
)
409 put_bits(&s
->pb
, 3, s
->f_code
); /* forward_f_code */
411 put_bits(&s
->pb
, 3, 7); /* forward_f_code */
414 // RAL: Backward f_code necessary for B frames
415 if (s
->pict_type
== B_TYPE
) {
416 put_bits(&s
->pb
, 1, 0); /* half pel coordinates */
417 if(s
->codec_id
== CODEC_ID_MPEG1VIDEO
)
418 put_bits(&s
->pb
, 3, s
->b_code
); /* backward_f_code */
420 put_bits(&s
->pb
, 3, 7); /* backward_f_code */
423 put_bits(&s
->pb
, 1, 0); /* extra bit picture */
425 if(s
->codec_id
== CODEC_ID_MPEG2VIDEO
){
426 put_header(s
, EXT_START_CODE
);
427 put_bits(&s
->pb
, 4, 8); //pic ext
428 if (s
->pict_type
== P_TYPE
|| s
->pict_type
== B_TYPE
) {
429 put_bits(&s
->pb
, 4, s
->f_code
);
430 put_bits(&s
->pb
, 4, s
->f_code
);
432 put_bits(&s
->pb
, 8, 255);
434 if (s
->pict_type
== B_TYPE
) {
435 put_bits(&s
->pb
, 4, s
->b_code
);
436 put_bits(&s
->pb
, 4, s
->b_code
);
438 put_bits(&s
->pb
, 8, 255);
440 put_bits(&s
->pb
, 2, s
->intra_dc_precision
);
441 put_bits(&s
->pb
, 2, s
->picture_structure
= PICT_FRAME
);
442 put_bits(&s
->pb
, 1, s
->top_field_first
);
443 put_bits(&s
->pb
, 1, s
->frame_pred_frame_dct
= 1);
444 put_bits(&s
->pb
, 1, s
->concealment_motion_vectors
);
445 put_bits(&s
->pb
, 1, s
->q_scale_type
);
446 put_bits(&s
->pb
, 1, s
->intra_vlc_format
);
447 put_bits(&s
->pb
, 1, s
->alternate_scan
);
448 put_bits(&s
->pb
, 1, s
->repeat_first_field
);
449 put_bits(&s
->pb
, 1, s
->chroma_420_type
=1);
450 put_bits(&s
->pb
, 1, s
->progressive_frame
=1);
451 put_bits(&s
->pb
, 1, 0); //composite_display_flag
455 ff_mpeg1_encode_slice_header(s
);
458 void mpeg1_encode_mb(MpegEncContext
*s
,
459 DCTELEM block
[6][64],
460 int motion_x
, int motion_y
)
463 const int mb_x
= s
->mb_x
;
464 const int mb_y
= s
->mb_y
;
465 const int first_mb
= mb_x
== s
->resync_mb_x
&& mb_y
== s
->resync_mb_y
;
470 if (s
->block_last_index
[i
] >= 0)
474 if (cbp
== 0 && !first_mb
&& (mb_x
!= s
->mb_width
- 1 || (mb_y
!= s
->mb_height
- 1 && s
->codec_id
== CODEC_ID_MPEG1VIDEO
)) &&
475 ((s
->pict_type
== P_TYPE
&& (motion_x
| motion_y
) == 0) ||
476 (s
->pict_type
== B_TYPE
&& s
->mv_dir
== s
->last_mv_dir
&& (((s
->mv_dir
& MV_DIR_FORWARD
) ?
((s
->mv
[0][0][0] - s
->last_mv
[0][0][0])|(s
->mv
[0][0][1] - s
->last_mv
[0][0][1])) : 0) |
477 ((s
->mv_dir
& MV_DIR_BACKWARD
) ?
((s
->mv
[1][0][0] - s
->last_mv
[1][0][0])|(s
->mv
[1][0][1] - s
->last_mv
[1][0][1])) : 0)) == 0))) {
479 s
->qscale
-= s
->dquant
;
485 assert(s
->mb_skip_run
== 0);
486 encode_mb_skip_run(s
, s
->mb_x
);
488 encode_mb_skip_run(s
, s
->mb_skip_run
);
491 if (s
->pict_type
== I_TYPE
) {
492 if(s
->dquant
&& cbp
){
493 put_bits(&s
->pb
, 2, 1); /* macroblock_type : macroblock_quant = 1 */
494 put_bits(&s
->pb
, 5, s
->qscale
);
496 put_bits(&s
->pb
, 1, 1); /* macroblock_type : macroblock_quant = 0 */
497 s
->qscale
-= s
->dquant
;
499 s
->misc_bits
+= get_bits_diff(s
);
501 } else if (s
->mb_intra
) {
502 if(s
->dquant
&& cbp
){
503 put_bits(&s
->pb
, 6, 0x01);
504 put_bits(&s
->pb
, 5, s
->qscale
);
506 put_bits(&s
->pb
, 5, 0x03);
507 s
->qscale
-= s
->dquant
;
509 s
->misc_bits
+= get_bits_diff(s
);
511 s
->last_mv
[0][0][0] =
512 s
->last_mv
[0][0][1] = 0;
513 } else if (s
->pict_type
== P_TYPE
) {
515 if (motion_x
== 0 && motion_y
== 0) {
517 put_bits(&s
->pb
, 5, 1); /* macroblock_pattern & quant */
518 put_bits(&s
->pb
, 5, s
->qscale
);
520 put_bits(&s
->pb
, 2, 1); /* macroblock_pattern only */
522 s
->misc_bits
+= get_bits_diff(s
);
523 put_bits(&s
->pb
, mbPatTable
[cbp
- 1][1], mbPatTable
[cbp
- 1][0]);
526 put_bits(&s
->pb
, 5, 2); /* motion + cbp */
527 put_bits(&s
->pb
, 5, s
->qscale
);
529 put_bits(&s
->pb
, 1, 1); /* motion + cbp */
531 s
->misc_bits
+= get_bits_diff(s
);
532 mpeg1_encode_motion(s
, motion_x
- s
->last_mv
[0][0][0], s
->f_code
); // RAL: f_code parameter added
533 mpeg1_encode_motion(s
, motion_y
- s
->last_mv
[0][0][1], s
->f_code
); // RAL: f_code parameter added
534 s
->mv_bits
+= get_bits_diff(s
);
535 put_bits(&s
->pb
, mbPatTable
[cbp
- 1][1], mbPatTable
[cbp
- 1][0]);
538 put_bits(&s
->pb
, 3, 1); /* motion only */
539 mpeg1_encode_motion(s
, motion_x
- s
->last_mv
[0][0][0], s
->f_code
); // RAL: f_code parameter added
540 mpeg1_encode_motion(s
, motion_y
- s
->last_mv
[0][0][1], s
->f_code
); // RAL: f_code parameter added
541 s
->qscale
-= s
->dquant
;
542 s
->mv_bits
+= get_bits_diff(s
);
546 { // RAL: All the following bloc added for B frames:
548 { // With coded bloc pattern
549 if (s
->mv_dir
== (MV_DIR_FORWARD
| MV_DIR_BACKWARD
))
550 { // Bi-directional motion
553 put_bits(&s
->pb
, 5, 2);
554 put_bits(&s
->pb
, 5, s
->qscale
);
556 else // Without QScale
557 put_bits(&s
->pb
, 2, 3);
558 s
->misc_bits
+= get_bits_diff(s
);
559 mpeg1_encode_motion(s
, s
->mv
[0][0][0] - s
->last_mv
[0][0][0], s
->f_code
);
560 mpeg1_encode_motion(s
, s
->mv
[0][0][1] - s
->last_mv
[0][0][1], s
->f_code
);
561 mpeg1_encode_motion(s
, s
->mv
[1][0][0] - s
->last_mv
[1][0][0], s
->b_code
);
562 mpeg1_encode_motion(s
, s
->mv
[1][0][1] - s
->last_mv
[1][0][1], s
->b_code
);
565 s
->mv_bits
+= get_bits_diff(s
);
566 put_bits(&s
->pb
, mbPatTable
[cbp
- 1][1], mbPatTable
[cbp
- 1][0]);
568 else if (s
->mv_dir
== MV_DIR_BACKWARD
)
572 put_bits(&s
->pb
, 6, 2);
573 put_bits(&s
->pb
, 5, s
->qscale
);
575 else // Without QScale
576 put_bits(&s
->pb
, 3, 3);
577 s
->misc_bits
+= get_bits_diff(s
);
578 mpeg1_encode_motion(s
, motion_x
- s
->last_mv
[1][0][0], s
->b_code
);
579 mpeg1_encode_motion(s
, motion_y
- s
->last_mv
[1][0][1], s
->b_code
);
581 s
->mv_bits
+= get_bits_diff(s
);
582 put_bits(&s
->pb
, mbPatTable
[cbp
- 1][1], mbPatTable
[cbp
- 1][0]);
584 else if (s
->mv_dir
== MV_DIR_FORWARD
)
588 put_bits(&s
->pb
, 6, 3);
589 put_bits(&s
->pb
, 5, s
->qscale
);
591 else // Without QScale
592 put_bits(&s
->pb
, 4, 3);
593 s
->misc_bits
+= get_bits_diff(s
);
594 mpeg1_encode_motion(s
, motion_x
- s
->last_mv
[0][0][0], s
->f_code
);
595 mpeg1_encode_motion(s
, motion_y
- s
->last_mv
[0][0][1], s
->f_code
);
597 s
->mv_bits
+= get_bits_diff(s
);
598 put_bits(&s
->pb
, mbPatTable
[cbp
- 1][1], mbPatTable
[cbp
- 1][0]);
602 { // No coded bloc pattern
603 if (s
->mv_dir
== (MV_DIR_FORWARD
| MV_DIR_BACKWARD
))
604 { // Bi-directional motion
605 put_bits(&s
->pb
, 2, 2); /* backward & forward motion */
606 mpeg1_encode_motion(s
, s
->mv
[0][0][0] - s
->last_mv
[0][0][0], s
->f_code
);
607 mpeg1_encode_motion(s
, s
->mv
[0][0][1] - s
->last_mv
[0][0][1], s
->f_code
);
608 mpeg1_encode_motion(s
, s
->mv
[1][0][0] - s
->last_mv
[1][0][0], s
->b_code
);
609 mpeg1_encode_motion(s
, s
->mv
[1][0][1] - s
->last_mv
[1][0][1], s
->b_code
);
613 else if (s
->mv_dir
== MV_DIR_BACKWARD
)
615 put_bits(&s
->pb
, 3, 2); /* backward motion only */
616 mpeg1_encode_motion(s
, motion_x
- s
->last_mv
[1][0][0], s
->b_code
);
617 mpeg1_encode_motion(s
, motion_y
- s
->last_mv
[1][0][1], s
->b_code
);
620 else if (s
->mv_dir
== MV_DIR_FORWARD
)
622 put_bits(&s
->pb
, 4, 2); /* forward motion only */
623 mpeg1_encode_motion(s
, motion_x
- s
->last_mv
[0][0][0], s
->f_code
);
624 mpeg1_encode_motion(s
, motion_y
- s
->last_mv
[0][0][1], s
->f_code
);
627 s
->qscale
-= s
->dquant
;
628 s
->mv_bits
+= get_bits_diff(s
);
630 // End of bloc from RAL
633 if (cbp
& (1 << (5 - i
))) {
634 mpeg1_encode_block(s
, block
[i
], i
);
639 s
->i_tex_bits
+= get_bits_diff(s
);
641 s
->p_tex_bits
+= get_bits_diff(s
);
645 if (s
->mv_dir
& MV_DIR_FORWARD
)
647 s
->last_mv
[0][0][0]= s
->mv
[0][0][0];
648 s
->last_mv
[0][0][1]= s
->mv
[0][0][1];
650 if (s
->mv_dir
& MV_DIR_BACKWARD
)
652 s
->last_mv
[1][0][0]= s
->mv
[1][0][0];
653 s
->last_mv
[1][0][1]= s
->mv
[1][0][1];
657 // RAL: Parameter added: f_or_b_code
658 static void mpeg1_encode_motion(MpegEncContext
*s
, int val
, int f_or_b_code
)
660 int code
, bit_size
, l
, m
, bits
, range
, sign
;
666 mbMotionVectorTable
[0][1],
667 mbMotionVectorTable
[0][0]);
669 bit_size
= f_or_b_code
- 1;
670 range
= 1 << bit_size
;
671 /* modulo encoding */
676 } else if (val
>= l
) {
682 code
= (val
>> bit_size
) + 1;
683 bits
= val
& (range
- 1);
688 code
= (val
>> bit_size
) + 1;
689 bits
= val
& (range
- 1);
693 assert(code
> 0 && code
<= 16);
696 mbMotionVectorTable
[code
][1],
697 mbMotionVectorTable
[code
][0]);
699 put_bits(&s
->pb
, 1, sign
);
701 put_bits(&s
->pb
, bit_size
, bits
);
706 void ff_mpeg1_encode_init(MpegEncContext
*s
)
722 mpeg1_max_level
[0][i
]= rl_mpeg1
.max_level
[0][i
];
723 mpeg1_index_run
[0][i
]= rl_mpeg1
.index_run
[0][i
];
726 init_uni_ac_vlc(&rl_mpeg1
, uni_mpeg1_ac_vlc_bits
, uni_mpeg1_ac_vlc_len
);
728 /* build unified dc encoding tables */
729 for(i
=-255; i
<256; i
++)
737 index
= vlc_dc_table
[adiff
];
739 bits
= vlc_dc_lum_bits
[index
] + index
;
740 code
= (vlc_dc_lum_code
[index
]<<index
) + (diff
& ((1 << index
) - 1));
741 mpeg1_lum_dc_uni
[i
+255]= bits
+ (code
<<8);
743 bits
= vlc_dc_chroma_bits
[index
] + index
;
744 code
= (vlc_dc_chroma_code
[index
]<<index
) + (diff
& ((1 << index
) - 1));
745 mpeg1_chr_dc_uni
[i
+255]= bits
+ (code
<<8);
748 mv_penalty
= av_mallocz( sizeof(uint8_t)*(MAX_FCODE
+1)*(2*MAX_MV
+1) );
750 for(f_code
=1; f_code
<=MAX_FCODE
; f_code
++){
751 for(mv
=-MAX_MV
; mv
<=MAX_MV
; mv
++){
754 if(mv
==0) len
= mbMotionVectorTable
[0][1];
756 int val
, bit_size
, range
, code
;
758 bit_size
= s
->f_code
- 1;
759 range
= 1 << bit_size
;
765 code
= (val
>> bit_size
) + 1;
767 len
= mbMotionVectorTable
[code
][1] + 1 + bit_size
;
769 len
= mbMotionVectorTable
[16][1] + 2 + bit_size
;
773 mv_penalty
[f_code
][mv
+MAX_MV
]= len
;
778 for(f_code
=MAX_FCODE
; f_code
>0; f_code
--){
779 for(mv
=-(8<<f_code
); mv
<(8<<f_code
); mv
++){
780 fcode_tab
[mv
+MAX_MV
]= f_code
;
784 s
->me
.mv_penalty
= mv_penalty
;
785 s
->fcode_tab
= fcode_tab
;
786 if(s
->codec_id
== CODEC_ID_MPEG1VIDEO
){
793 s
->intra_ac_vlc_length
=
794 s
->inter_ac_vlc_length
=
795 s
->intra_ac_vlc_last_length
=
796 s
->inter_ac_vlc_last_length
= uni_mpeg1_ac_vlc_len
;
799 static inline void encode_dc(MpegEncContext
*s
, int diff
, int component
)
801 if (component
== 0) {
804 mpeg1_lum_dc_uni
[diff
+255]&0xFF,
805 mpeg1_lum_dc_uni
[diff
+255]>>8);
809 mpeg1_chr_dc_uni
[diff
+255]&0xFF,
810 mpeg1_chr_dc_uni
[diff
+255]>>8);
814 static void mpeg1_encode_block(MpegEncContext
*s
,
818 int alevel
, level
, last_non_zero
, dc
, diff
, i
, j
, run
, last_index
, sign
;
820 // RLTable *rl = &rl_mpeg1;
822 last_index
= s
->block_last_index
[n
];
826 component
= (n
<= 3 ?
0 : n
- 4 + 1);
827 dc
= block
[0]; /* overflow is impossible */
828 diff
= dc
- s
->last_dc
[component
];
829 encode_dc(s
, diff
, component
);
830 s
->last_dc
[component
] = dc
;
833 if (s->intra_vlc_format)
839 /* encode the first coefficient : needs to be done here because
840 it is handled slightly differently */
842 if (abs(level
) == 1) {
843 code
= ((uint32_t)level
>> 31); /* the sign bit */
844 put_bits(&s
->pb
, 2, code
| 0x02);
853 /* now quantify & encode AC coefs */
854 last_non_zero
= i
- 1;
856 for(;i
<=last_index
;i
++) {
857 j
= s
->intra_scantable
.permutated
[i
];
862 dprintf("level[%d]=%d\n", i
, level
);
864 /* encode using VLC */
866 run
= i
- last_non_zero
- 1;
869 MASK_ABS(sign
, alevel
)
872 // code = get_rl_index(rl, 0, run, alevel);
873 if (alevel
<= mpeg1_max_level
[0][run
]){
874 code
= mpeg1_index_run
[0][run
] + alevel
- 1;
875 /* store the vlc & sign at once */
876 put_bits(&s
->pb
, mpeg1_vlc
[code
][1]+1, (mpeg1_vlc
[code
][0]<<1) + sign
);
878 /* escape seems to be pretty rare <5% so i dont optimize it */
879 put_bits(&s
->pb
, mpeg1_vlc
[111/*rl->n*/][1], mpeg1_vlc
[111/*rl->n*/][0]);
880 /* escape: only clip in this case */
881 put_bits(&s
->pb
, 6, run
);
882 if(s
->codec_id
== CODEC_ID_MPEG1VIDEO
){
884 put_bits(&s
->pb
, 8, level
& 0xff);
887 put_bits(&s
->pb
, 16, 0x8001 + level
+ 255);
889 put_bits(&s
->pb
, 16, level
& 0xffff);
893 put_bits(&s
->pb
, 12, level
& 0xfff);
900 put_bits(&s
->pb
, 2, 0x2);
902 #endif //CONFIG_ENCODERS
904 /******************************************/
907 static VLC dc_lum_vlc
;
908 static VLC dc_chroma_vlc
;
910 static VLC mbincr_vlc
;
911 static VLC mb_ptype_vlc
;
912 static VLC mb_btype_vlc
;
913 static VLC mb_pat_vlc
;
915 static void init_vlcs()
922 init_vlc(&dc_lum_vlc
, DC_VLC_BITS
, 12,
923 vlc_dc_lum_bits
, 1, 1,
924 vlc_dc_lum_code
, 2, 2);
925 init_vlc(&dc_chroma_vlc
, DC_VLC_BITS
, 12,
926 vlc_dc_chroma_bits
, 1, 1,
927 vlc_dc_chroma_code
, 2, 2);
928 init_vlc(&mv_vlc
, MV_VLC_BITS
, 17,
929 &mbMotionVectorTable
[0][1], 2, 1,
930 &mbMotionVectorTable
[0][0], 2, 1);
931 init_vlc(&mbincr_vlc
, MBINCR_VLC_BITS
, 36,
932 &mbAddrIncrTable
[0][1], 2, 1,
933 &mbAddrIncrTable
[0][0], 2, 1);
934 init_vlc(&mb_pat_vlc
, MB_PAT_VLC_BITS
, 63,
935 &mbPatTable
[0][1], 2, 1,
936 &mbPatTable
[0][0], 2, 1);
938 init_vlc(&mb_ptype_vlc
, MB_PTYPE_VLC_BITS
, 7,
939 &table_mb_ptype
[0][1], 2, 1,
940 &table_mb_ptype
[0][0], 2, 1);
941 init_vlc(&mb_btype_vlc
, MB_BTYPE_VLC_BITS
, 11,
942 &table_mb_btype
[0][1], 2, 1,
943 &table_mb_btype
[0][0], 2, 1);
947 init_2d_vlc_rl(&rl_mpeg1
);
948 init_2d_vlc_rl(&rl_mpeg2
);
952 static inline int get_dmv(MpegEncContext
*s
)
954 if(get_bits1(&s
->gb
))
955 return 1 - (get_bits1(&s
->gb
) << 1);
960 static inline int get_qscale(MpegEncContext
*s
)
962 int qscale
= get_bits(&s
->gb
, 5);
963 if (s
->codec_id
== CODEC_ID_MPEG2VIDEO
) {
964 if (s
->q_scale_type
) {
965 return non_linear_qscale
[qscale
];
973 /* motion type (for mpeg2) */
979 static int mpeg_decode_mb(MpegEncContext
*s
,
980 DCTELEM block
[6][64])
982 int i
, j
, k
, cbp
, val
, mb_type
, motion_type
;
984 dprintf("decode_mb: x=%d y=%d\n", s
->mb_x
, s
->mb_y
);
986 assert(s
->mb_skiped
==0);
988 if (s
->mb_skip_run
-- != 0) {
989 if(s
->pict_type
== I_TYPE
){
990 fprintf(stderr
, "skiped MB in I frame at %d %d\n", s
->mb_x
, s
->mb_y
);
997 s
->block_last_index
[i
] = -1;
998 s
->mv_type
= MV_TYPE_16X16
;
999 if (s
->pict_type
== P_TYPE
) {
1000 /* if P type, zero motion vector is implied */
1001 s
->mv_dir
= MV_DIR_FORWARD
;
1002 s
->mv
[0][0][0] = s
->mv
[0][0][1] = 0;
1003 s
->last_mv
[0][0][0] = s
->last_mv
[0][0][1] = 0;
1004 s
->last_mv
[0][1][0] = s
->last_mv
[0][1][1] = 0;
1006 s
->current_picture
.mb_type
[ s
->mb_x
+ s
->mb_y
*s
->mb_stride
]= MB_TYPE_SKIP
| MB_TYPE_L0
| MB_TYPE_16x16
;
1008 /* if B type, reuse previous vectors and directions */
1009 s
->mv
[0][0][0] = s
->last_mv
[0][0][0];
1010 s
->mv
[0][0][1] = s
->last_mv
[0][0][1];
1011 s
->mv
[1][0][0] = s
->last_mv
[1][0][0];
1012 s
->mv
[1][0][1] = s
->last_mv
[1][0][1];
1014 s
->current_picture
.mb_type
[ s
->mb_x
+ s
->mb_y
*s
->mb_stride
]=
1015 s
->current_picture
.mb_type
[ s
->mb_x
+ s
->mb_y
*s
->mb_stride
- 1] | MB_TYPE_SKIP
;
1016 // assert(s->current_picture.mb_type[ s->mb_x + s->mb_y*s->mb_stride - 1]&(MB_TYPE_16x16|MB_TYPE_16x8));
1018 if((s
->mv
[0][0][0]|s
->mv
[0][0][1]|s
->mv
[1][0][0]|s
->mv
[1][0][1])==0)
1025 switch(s
->pict_type
) {
1028 if (get_bits1(&s
->gb
) == 0) {
1029 if (get_bits1(&s
->gb
) == 0){
1030 fprintf(stderr
, "invalid mb type in I Frame at %d %d\n", s
->mb_x
, s
->mb_y
);
1033 mb_type
= MB_TYPE_QUANT
| MB_TYPE_INTRA
;
1035 mb_type
= MB_TYPE_INTRA
;
1039 mb_type
= get_vlc2(&s
->gb
, mb_ptype_vlc
.table
, MB_PTYPE_VLC_BITS
, 1);
1041 fprintf(stderr
, "invalid mb type in P Frame at %d %d\n", s
->mb_x
, s
->mb_y
);
1044 mb_type
= ptype2mb_type
[ mb_type
];
1047 mb_type
= get_vlc2(&s
->gb
, mb_btype_vlc
.table
, MB_BTYPE_VLC_BITS
, 1);
1049 fprintf(stderr
, "invalid mb type in B Frame at %d %d\n", s
->mb_x
, s
->mb_y
);
1052 mb_type
= btype2mb_type
[ mb_type
];
1055 dprintf("mb_type=%x\n", mb_type
);
1056 // motion_type = 0; /* avoid warning */
1057 if (IS_INTRA(mb_type
)) {
1058 /* compute dct type */
1059 if (s
->picture_structure
== PICT_FRAME
&& //FIXME add a interlaced_dct coded var?
1060 !s
->frame_pred_frame_dct
) {
1061 s
->interlaced_dct
= get_bits1(&s
->gb
);
1064 if (IS_QUANT(mb_type
))
1065 s
->qscale
= get_qscale(s
);
1067 if (s
->concealment_motion_vectors
) {
1068 /* just parse them */
1069 if (s
->picture_structure
!= PICT_FRAME
)
1070 skip_bits1(&s
->gb
); /* field select */
1072 s
->mv
[0][0][0]= s
->last_mv
[0][0][0]= s
->last_mv
[0][1][0] =
1073 mpeg_decode_motion(s
, s
->mpeg_f_code
[0][0], s
->last_mv
[0][0][0]);
1074 s
->mv
[0][0][1]= s
->last_mv
[0][0][1]= s
->last_mv
[0][1][1] =
1075 mpeg_decode_motion(s
, s
->mpeg_f_code
[0][1], s
->last_mv
[0][0][1]);
1077 skip_bits1(&s
->gb
); /* marker */
1079 memset(s
->last_mv
, 0, sizeof(s
->last_mv
)); /* reset mv prediction */
1082 if (s
->codec_id
== CODEC_ID_MPEG2VIDEO
) {
1084 if (mpeg2_decode_block_intra(s
, block
[i
], i
) < 0)
1089 if (mpeg1_decode_block_intra(s
, block
[i
], i
) < 0)
1094 if (mb_type
& MB_TYPE_ZERO_MV
){
1095 assert(mb_type
& MB_TYPE_PAT
);
1097 /* compute dct type */
1098 if (s
->picture_structure
== PICT_FRAME
&& //FIXME add a interlaced_dct coded var?
1099 !s
->frame_pred_frame_dct
) {
1100 s
->interlaced_dct
= get_bits1(&s
->gb
);
1103 if (IS_QUANT(mb_type
))
1104 s
->qscale
= get_qscale(s
);
1106 s
->mv_dir
= MV_DIR_FORWARD
;
1107 s
->mv_type
= MV_TYPE_16X16
;
1108 s
->last_mv
[0][0][0] = 0;
1109 s
->last_mv
[0][0][1] = 0;
1110 s
->last_mv
[0][1][0] = 0;
1111 s
->last_mv
[0][1][1] = 0;
1115 assert(mb_type
& MB_TYPE_L0L1
);
1116 //FIXME decide if MBs in field pictures are MB_TYPE_INTERLACED
1117 /* get additionnal motion vector type */
1118 if (s
->frame_pred_frame_dct
)
1119 motion_type
= MT_FRAME
;
1121 motion_type
= get_bits(&s
->gb
, 2);
1124 /* compute dct type */
1125 if (s
->picture_structure
== PICT_FRAME
&& //FIXME add a interlaced_dct coded var?
1126 !s
->frame_pred_frame_dct
&& IS_PAT(mb_type
)) {
1127 s
->interlaced_dct
= get_bits1(&s
->gb
);
1130 if (IS_QUANT(mb_type
))
1131 s
->qscale
= get_qscale(s
);
1133 /* motion vectors */
1136 if (USES_LIST(mb_type
, i
)) {
1137 s
->mv_dir
|= (MV_DIR_FORWARD
>> i
);
1138 dprintf("motion_type=%d\n", motion_type
);
1139 switch(motion_type
) {
1140 case MT_FRAME
: /* or MT_16X8 */
1141 if (s
->picture_structure
== PICT_FRAME
) {
1143 mb_type
|= MB_TYPE_16x16
;
1144 s
->mv_type
= MV_TYPE_16X16
;
1145 s
->mv
[i
][0][0]= s
->last_mv
[i
][0][0]= s
->last_mv
[i
][1][0] =
1146 mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][0], s
->last_mv
[i
][0][0]);
1147 s
->mv
[i
][0][1]= s
->last_mv
[i
][0][1]= s
->last_mv
[i
][1][1] =
1148 mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][1], s
->last_mv
[i
][0][1]);
1149 /* full_pel: only for mpeg1 */
1150 if (s
->full_pel
[i
]){
1151 s
->mv
[i
][0][0] <<= 1;
1152 s
->mv
[i
][0][1] <<= 1;
1156 mb_type
|= MB_TYPE_16x8
;
1157 s
->mv_type
= MV_TYPE_16X8
;
1159 s
->field_select
[i
][j
] = get_bits1(&s
->gb
);
1161 val
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][k
],
1162 s
->last_mv
[i
][j
][k
]);
1163 s
->last_mv
[i
][j
][k
] = val
;
1164 s
->mv
[i
][j
][k
] = val
;
1170 s
->mv_type
= MV_TYPE_FIELD
;
1171 if (s
->picture_structure
== PICT_FRAME
) {
1172 mb_type
|= MB_TYPE_16x8
| MB_TYPE_INTERLACED
;
1174 s
->field_select
[i
][j
] = get_bits1(&s
->gb
);
1175 val
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][0],
1176 s
->last_mv
[i
][j
][0]);
1177 s
->last_mv
[i
][j
][0] = val
;
1178 s
->mv
[i
][j
][0] = val
;
1179 dprintf("fmx=%d\n", val
);
1180 val
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][1],
1181 s
->last_mv
[i
][j
][1] >> 1);
1182 s
->last_mv
[i
][j
][1] = val
<< 1;
1183 s
->mv
[i
][j
][1] = val
;
1184 dprintf("fmy=%d\n", val
);
1187 mb_type
|= MB_TYPE_16x16
;
1188 s
->field_select
[i
][0] = get_bits1(&s
->gb
);
1190 val
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][k
],
1191 s
->last_mv
[i
][0][k
]);
1192 s
->last_mv
[i
][0][k
] = val
;
1193 s
->last_mv
[i
][1][k
] = val
;
1194 s
->mv
[i
][0][k
] = val
;
1200 int dmx
, dmy
, mx
, my
, m
;
1202 mx
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][0],
1203 s
->last_mv
[i
][0][0]);
1204 s
->last_mv
[i
][0][0] = mx
;
1205 s
->last_mv
[i
][1][0] = mx
;
1207 my
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][1],
1208 s
->last_mv
[i
][0][1] >> 1);
1210 s
->mv_type
= MV_TYPE_DMV
;
1213 s
->last_mv
[i
][0][1] = my
<<1;
1214 s
->last_mv
[i
][1][1] = my
<<1;
1216 s
->mv
[i
][0][0] = mx
;
1217 s
->mv
[i
][0][1] = my
;
1218 s
->mv
[i
][1][0] = mx
;//not used
1219 s
->mv
[i
][1][1] = my
;//not used
1221 if (s
->picture_structure
== PICT_FRAME
) {
1222 mb_type
|= MB_TYPE_16x16
| MB_TYPE_INTERLACED
;
1224 //m = 1 + 2 * s->top_field_first;
1225 m
= s
->top_field_first ?
1 : 3;
1227 /* top -> top pred */
1228 s
->mv
[i
][2][0] = ((mx
* m
+ (mx
> 0)) >> 1) + dmx
;
1229 s
->mv
[i
][2][1] = ((my
* m
+ (my
> 0)) >> 1) + dmy
- 1;
1231 s
->mv
[i
][3][0] = ((mx
* m
+ (mx
> 0)) >> 1) + dmx
;
1232 s
->mv
[i
][3][1] = ((my
* m
+ (my
> 0)) >> 1) + dmy
+ 1;
1234 mb_type
|= MB_TYPE_16x16
;
1236 s
->mv
[i
][2][0] = ((mx
+ (mx
> 0)) >> 1) + dmx
;
1237 s
->mv
[i
][2][1] = ((my
+ (my
> 0)) >> 1) + dmy
;
1238 if(s
->picture_structure
== PICT_TOP_FIELD
)
1252 if (IS_PAT(mb_type
)) {
1253 cbp
= get_vlc2(&s
->gb
, mb_pat_vlc
.table
, MB_PAT_VLC_BITS
, 1);
1255 fprintf(stderr
, "invalid cbp at %d %d\n", s
->mb_x
, s
->mb_y
);
1260 if (s
->codec_id
== CODEC_ID_MPEG2VIDEO
) {
1263 if (mpeg2_decode_block_non_intra(s
, block
[i
], i
) < 0)
1266 s
->block_last_index
[i
] = -1;
1273 if (mpeg1_decode_block_inter(s
, block
[i
], i
) < 0)
1276 s
->block_last_index
[i
] = -1;
1283 s
->block_last_index
[i
] = -1;
1287 s
->current_picture
.mb_type
[ s
->mb_x
+ s
->mb_y
*s
->mb_stride
]= mb_type
;
1292 /* as h263, but only 17 codes */
1293 static int mpeg_decode_motion(MpegEncContext
*s
, int fcode
, int pred
)
1295 int code
, sign
, val
, l
, shift
;
1297 code
= get_vlc2(&s
->gb
, mv_vlc
.table
, MV_VLC_BITS
, 2);
1305 sign
= get_bits1(&s
->gb
);
1309 val
= (val
- 1) << shift
;
1310 val
|= get_bits(&s
->gb
, shift
);
1317 /* modulo decoding */
1319 val
= ((val
+ l
)&(l
*2-1)) - l
;
1323 static inline int decode_dc(GetBitContext
*gb
, int component
)
1327 if (component
== 0) {
1328 code
= get_vlc2(gb
, dc_lum_vlc
.table
, DC_VLC_BITS
, 2);
1330 code
= get_vlc2(gb
, dc_chroma_vlc
.table
, DC_VLC_BITS
, 2);
1333 fprintf(stderr
, "invalid dc code at\n");
1339 diff
= get_xbits(gb
, code
);
1344 static inline int mpeg1_decode_block_intra(MpegEncContext
*s
,
1348 int level
, dc
, diff
, i
, j
, run
;
1350 RLTable
*rl
= &rl_mpeg1
;
1351 uint8_t * const scantable
= s
->intra_scantable
.permutated
;
1352 const uint16_t *quant_matrix
= s
->intra_matrix
;
1353 const int qscale
= s
->qscale
;
1356 component
= (n
<= 3 ?
0 : n
- 4 + 1);
1357 diff
= decode_dc(&s
->gb
, component
);
1360 dc
= s
->last_dc
[component
];
1362 s
->last_dc
[component
] = dc
;
1364 dprintf("dc=%d diff=%d\n", dc
, diff
);
1367 OPEN_READER(re
, &s
->gb
);
1368 /* now quantify & encode AC coefs */
1370 UPDATE_CACHE(re
, &s
->gb
);
1371 GET_RL_VLC(level
, run
, re
, &s
->gb
, rl
->rl_vlc
[0], TEX_VLC_BITS
, 2);
1375 } else if(level
!= 0) {
1378 level
= (level
*qscale
*quant_matrix
[j
])>>3;
1380 level
= (level
^ SHOW_SBITS(re
, &s
->gb
, 1)) - SHOW_SBITS(re
, &s
->gb
, 1);
1381 LAST_SKIP_BITS(re
, &s
->gb
, 1);
1384 run
= SHOW_UBITS(re
, &s
->gb
, 6)+1; LAST_SKIP_BITS(re
, &s
->gb
, 6);
1385 UPDATE_CACHE(re
, &s
->gb
);
1386 level
= SHOW_SBITS(re
, &s
->gb
, 8); SKIP_BITS(re
, &s
->gb
, 8);
1387 if (level
== -128) {
1388 level
= SHOW_UBITS(re
, &s
->gb
, 8) - 256; LAST_SKIP_BITS(re
, &s
->gb
, 8);
1389 } else if (level
== 0) {
1390 level
= SHOW_UBITS(re
, &s
->gb
, 8) ; LAST_SKIP_BITS(re
, &s
->gb
, 8);
1396 level
= (level
*qscale
*quant_matrix
[j
])>>3;
1400 level
= (level
*qscale
*quant_matrix
[j
])>>3;
1405 fprintf(stderr
, "ac-tex damaged at %d %d\n", s
->mb_x
, s
->mb_y
);
1411 CLOSE_READER(re
, &s
->gb
);
1413 s
->block_last_index
[n
] = i
;
1417 static inline int mpeg1_decode_block_inter(MpegEncContext
*s
,
1421 int level
, i
, j
, run
;
1422 RLTable
*rl
= &rl_mpeg1
;
1423 uint8_t * const scantable
= s
->intra_scantable
.permutated
;
1424 const uint16_t *quant_matrix
= s
->inter_matrix
;
1425 const int qscale
= s
->qscale
;
1429 OPEN_READER(re
, &s
->gb
);
1431 /* special case for the first coef. no need to add a second vlc table */
1432 UPDATE_CACHE(re
, &s
->gb
);
1433 v
= SHOW_UBITS(re
, &s
->gb
, 2);
1435 LAST_SKIP_BITS(re
, &s
->gb
, 2);
1436 level
= (3*qscale
*quant_matrix
[0])>>4;
1444 /* now quantify & encode AC coefs */
1446 UPDATE_CACHE(re
, &s
->gb
);
1447 GET_RL_VLC(level
, run
, re
, &s
->gb
, rl
->rl_vlc
[0], TEX_VLC_BITS
, 2);
1451 } else if(level
!= 0) {
1454 level
= ((level
*2+1)*qscale
*quant_matrix
[j
])>>4;
1456 level
= (level
^ SHOW_SBITS(re
, &s
->gb
, 1)) - SHOW_SBITS(re
, &s
->gb
, 1);
1457 LAST_SKIP_BITS(re
, &s
->gb
, 1);
1460 run
= SHOW_UBITS(re
, &s
->gb
, 6)+1; LAST_SKIP_BITS(re
, &s
->gb
, 6);
1461 UPDATE_CACHE(re
, &s
->gb
);
1462 level
= SHOW_SBITS(re
, &s
->gb
, 8); SKIP_BITS(re
, &s
->gb
, 8);
1463 if (level
== -128) {
1464 level
= SHOW_UBITS(re
, &s
->gb
, 8) - 256; LAST_SKIP_BITS(re
, &s
->gb
, 8);
1465 } else if (level
== 0) {
1466 level
= SHOW_UBITS(re
, &s
->gb
, 8) ; LAST_SKIP_BITS(re
, &s
->gb
, 8);
1472 level
= ((level
*2+1)*qscale
*quant_matrix
[j
])>>4;
1476 level
= ((level
*2+1)*qscale
*quant_matrix
[j
])>>4;
1481 fprintf(stderr
, "ac-tex damaged at %d %d\n", s
->mb_x
, s
->mb_y
);
1487 CLOSE_READER(re
, &s
->gb
);
1489 s
->block_last_index
[n
] = i
;
1493 /* Also does unquantization here, since I will never support mpeg2
1495 static inline int mpeg2_decode_block_non_intra(MpegEncContext
*s
,
1499 int level
, i
, j
, run
;
1500 RLTable
*rl
= &rl_mpeg1
;
1501 uint8_t * const scantable
= s
->intra_scantable
.permutated
;
1502 const uint16_t *quant_matrix
;
1503 const int qscale
= s
->qscale
;
1510 OPEN_READER(re
, &s
->gb
);
1513 quant_matrix
= s
->inter_matrix
;
1515 quant_matrix
= s
->chroma_inter_matrix
;
1517 /* special case for the first coef. no need to add a second vlc table */
1518 UPDATE_CACHE(re
, &s
->gb
);
1519 v
= SHOW_UBITS(re
, &s
->gb
, 2);
1521 LAST_SKIP_BITS(re
, &s
->gb
, 2);
1522 level
= (3*qscale
*quant_matrix
[0])>>5;
1530 /* now quantify & encode AC coefs */
1532 UPDATE_CACHE(re
, &s
->gb
);
1533 GET_RL_VLC(level
, run
, re
, &s
->gb
, rl
->rl_vlc
[0], TEX_VLC_BITS
, 2);
1537 } else if(level
!= 0) {
1540 level
= ((level
*2+1)*qscale
*quant_matrix
[j
])>>5;
1541 level
= (level
^ SHOW_SBITS(re
, &s
->gb
, 1)) - SHOW_SBITS(re
, &s
->gb
, 1);
1542 LAST_SKIP_BITS(re
, &s
->gb
, 1);
1545 run
= SHOW_UBITS(re
, &s
->gb
, 6)+1; LAST_SKIP_BITS(re
, &s
->gb
, 6);
1546 UPDATE_CACHE(re
, &s
->gb
);
1547 level
= SHOW_SBITS(re
, &s
->gb
, 12); SKIP_BITS(re
, &s
->gb
, 12);
1552 level
= ((-level
*2+1)*qscale
*quant_matrix
[j
])>>5;
1555 level
= ((level
*2+1)*qscale
*quant_matrix
[j
])>>5;
1559 fprintf(stderr
, "ac-tex damaged at %d %d\n", s
->mb_x
, s
->mb_y
);
1566 CLOSE_READER(re
, &s
->gb
);
1568 block
[63] ^= (mismatch
& 1);
1570 s
->block_last_index
[n
] = i
;
1574 static inline int mpeg2_decode_block_intra(MpegEncContext
*s
,
1578 int level
, dc
, diff
, i
, j
, run
;
1581 uint8_t * const scantable
= s
->intra_scantable
.permutated
;
1582 const uint16_t *quant_matrix
;
1583 const int qscale
= s
->qscale
;
1588 quant_matrix
= s
->intra_matrix
;
1591 quant_matrix
= s
->chroma_intra_matrix
;
1594 diff
= decode_dc(&s
->gb
, component
);
1597 dc
= s
->last_dc
[component
];
1599 s
->last_dc
[component
] = dc
;
1600 block
[0] = dc
<< (3 - s
->intra_dc_precision
);
1601 dprintf("dc=%d\n", block
[0]);
1602 mismatch
= block
[0] ^ 1;
1604 if (s
->intra_vlc_format
)
1610 OPEN_READER(re
, &s
->gb
);
1611 /* now quantify & encode AC coefs */
1613 UPDATE_CACHE(re
, &s
->gb
);
1614 GET_RL_VLC(level
, run
, re
, &s
->gb
, rl
->rl_vlc
[0], TEX_VLC_BITS
, 2);
1618 } else if(level
!= 0) {
1621 level
= (level
*qscale
*quant_matrix
[j
])>>4;
1622 level
= (level
^ SHOW_SBITS(re
, &s
->gb
, 1)) - SHOW_SBITS(re
, &s
->gb
, 1);
1623 LAST_SKIP_BITS(re
, &s
->gb
, 1);
1626 run
= SHOW_UBITS(re
, &s
->gb
, 6)+1; LAST_SKIP_BITS(re
, &s
->gb
, 6);
1627 UPDATE_CACHE(re
, &s
->gb
);
1628 level
= SHOW_SBITS(re
, &s
->gb
, 12); SKIP_BITS(re
, &s
->gb
, 12);
1632 level
= (-level
*qscale
*quant_matrix
[j
])>>4;
1635 level
= (level
*qscale
*quant_matrix
[j
])>>4;
1639 fprintf(stderr
, "ac-tex damaged at %d %d\n", s
->mb_x
, s
->mb_y
);
1646 CLOSE_READER(re
, &s
->gb
);
1648 block
[63]^= mismatch
&1;
1650 s
->block_last_index
[n
] = i
;
1654 typedef struct Mpeg1Context
{
1655 MpegEncContext mpeg_enc_ctx
;
1656 int mpeg_enc_ctx_allocated
; /* true if decoding context allocated */
1657 int repeat_field
; /* true if we must repeat the field */
1658 AVPanScan pan_scan
; /** some temporary storage for the panscan */
1661 static int mpeg_decode_init(AVCodecContext
*avctx
)
1663 Mpeg1Context
*s
= avctx
->priv_data
;
1665 s
->mpeg_enc_ctx
.flags
= avctx
->flags
;
1666 common_init(&s
->mpeg_enc_ctx
);
1669 s
->mpeg_enc_ctx_allocated
= 0;
1670 s
->mpeg_enc_ctx
.picture_number
= 0;
1671 s
->repeat_field
= 0;
1672 s
->mpeg_enc_ctx
.codec_id
= avctx
->codec
->id
;
1676 /* return the 8 bit start code value and update the search
1677 state. Return -1 if no start code found */
1678 static int find_start_code(uint8_t **pbuf_ptr
, uint8_t *buf_end
)
1681 unsigned int state
=0xFFFFFFFF, v
;
1684 buf_ptr
= *pbuf_ptr
;
1685 while (buf_ptr
< buf_end
) {
1687 if (state
== 0x000001) {
1688 state
= ((state
<< 8) | v
) & 0xffffff;
1692 state
= ((state
<< 8) | v
) & 0xffffff;
1696 *pbuf_ptr
= buf_ptr
;
1700 static int mpeg1_decode_picture(AVCodecContext
*avctx
,
1701 uint8_t *buf
, int buf_size
)
1703 Mpeg1Context
*s1
= avctx
->priv_data
;
1704 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
1707 init_get_bits(&s
->gb
, buf
, buf_size
*8);
1709 ref
= get_bits(&s
->gb
, 10); /* temporal ref */
1710 s
->pict_type
= get_bits(&s
->gb
, 3);
1711 dprintf("pict_type=%d number=%d\n", s
->pict_type
, s
->picture_number
);
1713 skip_bits(&s
->gb
, 16);
1714 if (s
->pict_type
== P_TYPE
|| s
->pict_type
== B_TYPE
) {
1715 s
->full_pel
[0] = get_bits1(&s
->gb
);
1716 f_code
= get_bits(&s
->gb
, 3);
1719 s
->mpeg_f_code
[0][0] = f_code
;
1720 s
->mpeg_f_code
[0][1] = f_code
;
1722 if (s
->pict_type
== B_TYPE
) {
1723 s
->full_pel
[1] = get_bits1(&s
->gb
);
1724 f_code
= get_bits(&s
->gb
, 3);
1727 s
->mpeg_f_code
[1][0] = f_code
;
1728 s
->mpeg_f_code
[1][1] = f_code
;
1730 s
->current_picture
.pict_type
= s
->pict_type
;
1731 s
->current_picture
.key_frame
= s
->pict_type
== I_TYPE
;
1739 static void mpeg_decode_sequence_extension(MpegEncContext
*s
)
1741 int horiz_size_ext
, vert_size_ext
;
1742 int bit_rate_ext
, vbv_buf_ext
;
1743 int frame_rate_ext_n
, frame_rate_ext_d
;
1746 skip_bits(&s
->gb
, 1); /* profil and level esc*/
1747 profile
= get_bits(&s
->gb
, 3);
1748 level
= get_bits(&s
->gb
, 4);
1749 s
->progressive_sequence
= get_bits1(&s
->gb
); /* progressive_sequence */
1750 skip_bits(&s
->gb
, 2); /* chroma_format */
1751 horiz_size_ext
= get_bits(&s
->gb
, 2);
1752 vert_size_ext
= get_bits(&s
->gb
, 2);
1753 s
->width
|= (horiz_size_ext
<< 12);
1754 s
->height
|= (vert_size_ext
<< 12);
1755 bit_rate_ext
= get_bits(&s
->gb
, 12); /* XXX: handle it */
1756 s
->bit_rate
= ((s
->bit_rate
/ 400) | (bit_rate_ext
<< 12)) * 400;
1757 skip_bits1(&s
->gb
); /* marker */
1758 vbv_buf_ext
= get_bits(&s
->gb
, 8);
1760 s
->low_delay
= get_bits1(&s
->gb
);
1761 if(s
->flags
& CODEC_FLAG_LOW_DELAY
) s
->low_delay
=1;
1763 frame_rate_ext_n
= get_bits(&s
->gb
, 2);
1764 frame_rate_ext_d
= get_bits(&s
->gb
, 5);
1766 &s
->avctx
->frame_rate
,
1767 &s
->avctx
->frame_rate_base
,
1768 frame_rate_tab
[s
->frame_rate_index
] * (frame_rate_ext_n
+1),
1769 MPEG1_FRAME_RATE_BASE
* (frame_rate_ext_d
+1),
1772 dprintf("sequence extension\n");
1773 s
->codec_id
= s
->avctx
->codec_id
= CODEC_ID_MPEG2VIDEO
;
1774 s
->avctx
->sub_id
= 2; /* indicates mpeg2 found */
1776 if(s
->aspect_ratio_info
<= 1)
1777 s
->avctx
->sample_aspect_ratio
= mpeg2_aspect
[s
->aspect_ratio_info
];
1779 s
->avctx
->sample_aspect_ratio
=
1781 mpeg2_aspect
[s
->aspect_ratio_info
],
1782 (AVRational
){s
->width
, s
->height
}
1786 if(s
->avctx
->debug
& FF_DEBUG_PICT_INFO
)
1787 printf("profile: %d, level: %d \n", profile
, level
);
1790 static void mpeg_decode_sequence_display_extension(Mpeg1Context
*s1
)
1792 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
1793 int color_description
, w
, h
;
1795 skip_bits(&s
->gb
, 3); /* video format */
1796 color_description
= get_bits1(&s
->gb
);
1797 if(color_description
){
1798 skip_bits(&s
->gb
, 8); /* color primaries */
1799 skip_bits(&s
->gb
, 8); /* transfer_characteristics */
1800 skip_bits(&s
->gb
, 8); /* matrix_coefficients */
1802 w
= get_bits(&s
->gb
, 14);
1803 skip_bits(&s
->gb
, 1); //marker
1804 h
= get_bits(&s
->gb
, 14);
1805 skip_bits(&s
->gb
, 1); //marker
1807 s1
->pan_scan
.width
= 16*w
;
1808 s1
->pan_scan
.height
=16*h
;
1810 if(s
->aspect_ratio_info
> 1)
1811 s
->avctx
->sample_aspect_ratio
=
1813 mpeg2_aspect
[s
->aspect_ratio_info
],
1817 if(s
->avctx
->debug
& FF_DEBUG_PICT_INFO
)
1818 printf("sde w:%d, h:%d\n", w
, h
);
1821 static void mpeg_decode_picture_display_extension(Mpeg1Context
*s1
)
1823 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
1826 for(i
=0; i
<1; i
++){ //FIXME count
1827 s1
->pan_scan
.position
[i
][0]= get_sbits(&s
->gb
, 16);
1828 skip_bits(&s
->gb
, 1); //marker
1829 s1
->pan_scan
.position
[i
][1]= get_sbits(&s
->gb
, 16);
1830 skip_bits(&s
->gb
, 1); //marker
1833 if(s
->avctx
->debug
& FF_DEBUG_PICT_INFO
)
1834 printf("pde (%d,%d) (%d,%d) (%d,%d)\n",
1835 s1
->pan_scan
.position
[0][0], s1
->pan_scan
.position
[0][1],
1836 s1
->pan_scan
.position
[1][0], s1
->pan_scan
.position
[1][1],
1837 s1
->pan_scan
.position
[2][0], s1
->pan_scan
.position
[2][1]
1841 static void mpeg_decode_quant_matrix_extension(MpegEncContext
*s
)
1845 dprintf("matrix extension\n");
1847 if (get_bits1(&s
->gb
)) {
1849 v
= get_bits(&s
->gb
, 8);
1850 j
= s
->dsp
.idct_permutation
[ ff_zigzag_direct
[i
] ];
1851 s
->intra_matrix
[j
] = v
;
1852 s
->chroma_intra_matrix
[j
] = v
;
1855 if (get_bits1(&s
->gb
)) {
1857 v
= get_bits(&s
->gb
, 8);
1858 j
= s
->dsp
.idct_permutation
[ ff_zigzag_direct
[i
] ];
1859 s
->inter_matrix
[j
] = v
;
1860 s
->chroma_inter_matrix
[j
] = v
;
1863 if (get_bits1(&s
->gb
)) {
1865 v
= get_bits(&s
->gb
, 8);
1866 j
= s
->dsp
.idct_permutation
[ ff_zigzag_direct
[i
] ];
1867 s
->chroma_intra_matrix
[j
] = v
;
1870 if (get_bits1(&s
->gb
)) {
1872 v
= get_bits(&s
->gb
, 8);
1873 j
= s
->dsp
.idct_permutation
[ ff_zigzag_direct
[i
] ];
1874 s
->chroma_inter_matrix
[j
] = v
;
1879 static void mpeg_decode_picture_coding_extension(MpegEncContext
*s
)
1881 s
->full_pel
[0] = s
->full_pel
[1] = 0;
1882 s
->mpeg_f_code
[0][0] = get_bits(&s
->gb
, 4);
1883 s
->mpeg_f_code
[0][1] = get_bits(&s
->gb
, 4);
1884 s
->mpeg_f_code
[1][0] = get_bits(&s
->gb
, 4);
1885 s
->mpeg_f_code
[1][1] = get_bits(&s
->gb
, 4);
1886 s
->intra_dc_precision
= get_bits(&s
->gb
, 2);
1887 s
->picture_structure
= get_bits(&s
->gb
, 2);
1888 s
->top_field_first
= get_bits1(&s
->gb
);
1889 s
->frame_pred_frame_dct
= get_bits1(&s
->gb
);
1890 s
->concealment_motion_vectors
= get_bits1(&s
->gb
);
1891 s
->q_scale_type
= get_bits1(&s
->gb
);
1892 s
->intra_vlc_format
= get_bits1(&s
->gb
);
1893 s
->alternate_scan
= get_bits1(&s
->gb
);
1894 s
->repeat_first_field
= get_bits1(&s
->gb
);
1895 s
->chroma_420_type
= get_bits1(&s
->gb
);
1896 s
->progressive_frame
= get_bits1(&s
->gb
);
1898 if(s
->picture_structure
== PICT_FRAME
)
1901 s
->first_field
^= 1;
1902 memset(s
->mbskip_table
, 0, s
->mb_stride
*s
->mb_height
);
1905 if(s
->alternate_scan
){
1906 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->inter_scantable
, ff_alternate_vertical_scan
);
1907 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->intra_scantable
, ff_alternate_vertical_scan
);
1908 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->intra_h_scantable
, ff_alternate_vertical_scan
);
1909 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->intra_v_scantable
, ff_alternate_vertical_scan
);
1911 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->inter_scantable
, ff_zigzag_direct
);
1912 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->intra_scantable
, ff_zigzag_direct
);
1913 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->intra_h_scantable
, ff_alternate_horizontal_scan
);
1914 ff_init_scantable(s
->dsp
.idct_permutation
, &s
->intra_v_scantable
, ff_alternate_vertical_scan
);
1917 /* composite display not parsed */
1918 dprintf("intra_dc_precision=%d\n", s
->intra_dc_precision
);
1919 dprintf("picture_structure=%d\n", s
->picture_structure
);
1920 dprintf("top field first=%d\n", s
->top_field_first
);
1921 dprintf("repeat first field=%d\n", s
->repeat_first_field
);
1922 dprintf("conceal=%d\n", s
->concealment_motion_vectors
);
1923 dprintf("intra_vlc_format=%d\n", s
->intra_vlc_format
);
1924 dprintf("alternate_scan=%d\n", s
->alternate_scan
);
1925 dprintf("frame_pred_frame_dct=%d\n", s
->frame_pred_frame_dct
);
1926 dprintf("progressive_frame=%d\n", s
->progressive_frame
);
1929 static void mpeg_decode_extension(AVCodecContext
*avctx
,
1930 uint8_t *buf
, int buf_size
)
1932 Mpeg1Context
*s1
= avctx
->priv_data
;
1933 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
1936 init_get_bits(&s
->gb
, buf
, buf_size
*8);
1938 ext_type
= get_bits(&s
->gb
, 4);
1941 mpeg_decode_sequence_extension(s
);
1944 mpeg_decode_sequence_display_extension(s1
);
1947 mpeg_decode_quant_matrix_extension(s
);
1950 mpeg_decode_picture_display_extension(s1
);
1953 mpeg_decode_picture_coding_extension(s
);
1958 static void exchange_uv(AVFrame
*f
){
1959 uint8_t *t
= f
->data
[1];
1960 f
->data
[1]= f
->data
[2];
1964 #define DECODE_SLICE_FATAL_ERROR -2
1965 #define DECODE_SLICE_ERROR -1
1966 #define DECODE_SLICE_OK 0
1970 * @return DECODE_SLICE_FATAL_ERROR if a non recoverable error occured<br>
1971 * DECODE_SLICE_ERROR if the slice is damaged<br>
1972 * DECODE_SLICE_OK if this slice is ok<br>
1974 static int mpeg_decode_slice(AVCodecContext
*avctx
,
1977 uint8_t **buf
, int buf_size
)
1979 Mpeg1Context
*s1
= avctx
->priv_data
;
1980 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
1982 const int field_pic
= s
->picture_structure
!= PICT_FRAME
;
1984 s
->resync_mb_x
= s
->mb_x
=
1985 s
->resync_mb_y
= s
->mb_y
= -1;
1987 start_code
= (start_code
- 1) & 0xff;
1988 if (start_code
>= s
->mb_height
){
1989 fprintf(stderr
, "slice below image (%d >= %d)\n", start_code
, s
->mb_height
);
1993 ff_mpeg1_clean_buffers(s
);
1994 s
->interlaced_dct
= 0;
1996 /* start frame decoding */
1997 if (s
->first_slice
) {
1998 if(s
->first_field
|| s
->picture_structure
==PICT_FRAME
){
1999 if(MPV_frame_start(s
, avctx
) < 0)
2000 return DECODE_SLICE_FATAL_ERROR
;
2002 ff_er_frame_start(s
);
2004 /* first check if we must repeat the frame */
2005 s
->current_picture_ptr
->repeat_pict
= 0;
2006 if (s
->repeat_first_field
) {
2007 if (s
->progressive_sequence
) {
2008 if (s
->top_field_first
)
2009 s
->current_picture_ptr
->repeat_pict
= 4;
2011 s
->current_picture_ptr
->repeat_pict
= 2;
2012 } else if (s
->progressive_frame
) {
2013 s
->current_picture_ptr
->repeat_pict
= 1;
2017 *s
->current_picture_ptr
->pan_scan
= s1
->pan_scan
;
2019 //printf("%d\n", s->current_picture_ptr->repeat_pict);
2021 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
){
2022 printf("qp:%d fc:%2d%2d%2d%2d %s %s %s %s dc:%d pstruct:%d fdct:%d cmv:%d qtype:%d ivlc:%d rff:%d %s\n",
2023 s
->qscale
, s
->mpeg_f_code
[0][0],s
->mpeg_f_code
[0][1],s
->mpeg_f_code
[1][0],s
->mpeg_f_code
[1][1],
2024 s
->pict_type
== I_TYPE ?
"I" : (s
->pict_type
== P_TYPE ?
"P" : (s
->pict_type
== B_TYPE ?
"B" : "S")),
2025 s
->progressive_sequence ?
"pro" :"", s
->alternate_scan ?
"alt" :"", s
->top_field_first ?
"top" :"",
2026 s
->intra_dc_precision
, s
->picture_structure
, s
->frame_pred_frame_dct
, s
->concealment_motion_vectors
,
2027 s
->q_scale_type
, s
->intra_vlc_format
, s
->repeat_first_field
, s
->chroma_420_type ?
"420" :"");
2029 }else{ //second field
2032 if(!s
->current_picture_ptr
){
2033 fprintf(stderr
, "first field missing\n");
2038 s
->current_picture
.data
[i
] = s
->current_picture_ptr
->data
[i
];
2039 if(s
->picture_structure
== PICT_BOTTOM_FIELD
){
2040 s
->current_picture
.data
[i
] += s
->current_picture_ptr
->linesize
[i
];
2045 // MPV_frame_start will call this function too,
2046 // but we need to call it on every field
2047 if(s
->avctx
->xvmc_acceleration
)
2048 XVMC_field_start(s
,avctx
);
2050 }//fi(s->first_slice)
2053 init_get_bits(&s
->gb
, *buf
, buf_size
*8);
2055 s
->qscale
= get_qscale(s
);
2057 fprintf(stderr
, "qscale == 0\n");
2061 /* extra slice info */
2062 while (get_bits1(&s
->gb
) != 0) {
2063 skip_bits(&s
->gb
, 8);
2069 int code
= get_vlc2(&s
->gb
, mbincr_vlc
.table
, MBINCR_VLC_BITS
, 2);
2071 fprintf(stderr
, "first mb_incr damaged\n");
2078 /* otherwise, stuffing, nothing to do */
2085 s
->resync_mb_x
= s
->mb_x
;
2086 s
->resync_mb_y
= s
->mb_y
= start_code
;
2088 ff_init_block_index(s
);
2091 s
->dsp
.clear_blocks(s
->block
[0]);
2093 ret
= mpeg_decode_mb(s
, s
->block
);
2095 dprintf("ret=%d\n", ret
);
2099 if(s
->motion_val
&& s
->pict_type
!= B_TYPE
){ //note motion_val is normally NULL unless we want to extract the MVs
2100 const int wrap
= s
->block_wrap
[0];
2101 const int xy
= s
->mb_x
*2 + 1 + (s
->mb_y
*2 +1)*wrap
;
2102 int motion_x
, motion_y
;
2105 motion_x
= motion_y
= 0;
2106 }else if (s
->mv_type
== MV_TYPE_16X16
) {
2107 motion_x
= s
->mv
[0][0][0];
2108 motion_y
= s
->mv
[0][0][1];
2109 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
2110 motion_x
= s
->mv
[0][0][0] + s
->mv
[0][1][0];
2111 motion_y
= s
->mv
[0][0][1] + s
->mv
[0][1][1];
2112 motion_x
= (motion_x
>>1) | (motion_x
&1);
2114 s
->motion_val
[xy
][0] = motion_x
;
2115 s
->motion_val
[xy
][1] = motion_y
;
2116 s
->motion_val
[xy
+ 1][0] = motion_x
;
2117 s
->motion_val
[xy
+ 1][1] = motion_y
;
2118 s
->motion_val
[xy
+ wrap
][0] = motion_x
;
2119 s
->motion_val
[xy
+ wrap
][1] = motion_y
;
2120 s
->motion_val
[xy
+ 1 + wrap
][0] = motion_x
;
2121 s
->motion_val
[xy
+ 1 + wrap
][1] = motion_y
;
2128 MPV_decode_mb(s
, s
->block
);
2130 if (++s
->mb_x
>= s
->mb_width
) {
2131 if(s
->avctx
->codec_tag
== ff_get_fourcc("VCR2"))
2132 exchange_uv((AVFrame
*)s
->current_picture_ptr
);
2134 ff_draw_horiz_band(s
, 16*s
->mb_y
, 16);
2136 if(s
->avctx
->codec_tag
== ff_get_fourcc("VCR2"))
2137 exchange_uv((AVFrame
*)s
->current_picture_ptr
);
2142 if(s
->mb_y
<<field_pic
>= s
->mb_height
){
2143 int left
= s
->gb
.size_in_bits
- get_bits_count(&s
->gb
);
2145 if(left
< 0 || (left
&& show_bits(&s
->gb
, FFMIN(left
, 23)))
2146 || (avctx
->error_resilience
>= FF_ER_AGGRESSIVE
&& left
>8)){
2147 fprintf(stderr
, "end missmatch left=%d\n", left
);
2153 ff_init_block_index(s
);
2156 /* skip mb handling */
2157 if (s
->mb_skip_run
== -1) {
2158 /* read again increment */
2161 int code
= get_vlc2(&s
->gb
, mbincr_vlc
.table
, MBINCR_VLC_BITS
, 2);
2163 fprintf(stderr
, "mb incr damaged\n");
2168 s
->mb_skip_run
+= 33;
2169 }else if(code
== 35){
2170 if(s
->mb_skip_run
!= 0 || show_bits(&s
->gb
, 15) != 0){
2171 fprintf(stderr
, "slice missmatch\n");
2174 goto eos
; /* end of slice */
2176 /* otherwise, stuffing, nothing to do */
2178 s
->mb_skip_run
+= code
;
2184 eos
: // end of slice
2185 *buf
+= get_bits_count(&s
->gb
)/8 - 1;
2186 //printf("y %d %d %d %d\n", s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y);
2191 * handles slice ends.
2192 * @return 1 if it seems to be the last slice of
2194 static int slice_end(AVCodecContext
*avctx
, AVFrame
*pict
)
2196 Mpeg1Context
*s1
= avctx
->priv_data
;
2197 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
2199 if (!s1
->mpeg_enc_ctx_allocated
|| !s
->current_picture_ptr
)
2203 if(s
->avctx
->xvmc_acceleration
)
2206 /* end of slice reached */
2207 if (/*s->mb_y<<field_pic == s->mb_height &&*/ !s
->first_field
) {
2210 if(s
->codec_id
== CODEC_ID_MPEG2VIDEO
){
2211 s
->current_picture_ptr
->qscale_type
= FF_QSCALE_TYPE_MPEG2
;
2213 s
->current_picture_ptr
->qscale_type
= FF_QSCALE_TYPE_MPEG1
;
2219 if (s
->pict_type
== B_TYPE
|| s
->low_delay
) {
2220 *pict
= *(AVFrame
*)s
->current_picture_ptr
;
2221 ff_print_debug_info(s
, s
->current_picture_ptr
);
2223 s
->picture_number
++;
2224 /* latency of 1 frame for I and P frames */
2225 /* XXX: use another variable than picture_number */
2226 if (s
->last_picture_ptr
!= NULL
) {
2227 *pict
= *(AVFrame
*)s
->last_picture_ptr
;
2228 ff_print_debug_info(s
, s
->last_picture_ptr
);
2231 if(s
->avctx
->codec_tag
== ff_get_fourcc("VCR2"))
2240 static int mpeg1_decode_sequence(AVCodecContext
*avctx
,
2241 uint8_t *buf
, int buf_size
)
2243 Mpeg1Context
*s1
= avctx
->priv_data
;
2244 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
2245 int width
, height
, i
, v
, j
;
2248 init_get_bits(&s
->gb
, buf
, buf_size
*8);
2250 width
= get_bits(&s
->gb
, 12);
2251 height
= get_bits(&s
->gb
, 12);
2252 s
->aspect_ratio_info
= get_bits(&s
->gb
, 4);
2253 if(s
->codec_id
== CODEC_ID_MPEG1VIDEO
){
2254 aspect
= mpeg1_aspect
[s
->aspect_ratio_info
];
2255 if(aspect
!=0.0) avctx
->sample_aspect_ratio
= av_d2q(aspect
, 30000);
2258 s
->frame_rate_index
= get_bits(&s
->gb
, 4);
2259 if (s
->frame_rate_index
== 0)
2261 s
->bit_rate
= get_bits(&s
->gb
, 18) * 400;
2262 if (get_bits1(&s
->gb
) == 0) /* marker */
2264 if (width
<= 0 || height
<= 0 ||
2265 (width
% 2) != 0 || (height
% 2) != 0)
2267 if (width
!= s
->width
||
2268 height
!= s
->height
) {
2269 /* start new mpeg1 context decoding */
2270 s
->out_format
= FMT_MPEG1
;
2271 if (s1
->mpeg_enc_ctx_allocated
) {
2276 avctx
->has_b_frames
= 1;
2278 avctx
->width
= width
;
2279 avctx
->height
= height
;
2282 &avctx
->frame_rate_base
,
2283 frame_rate_tab
[s
->frame_rate_index
],
2284 MPEG1_FRAME_RATE_BASE
, //FIXME store in allready reduced form
2287 avctx
->bit_rate
= s
->bit_rate
;
2289 //get_format() or set_video(width,height,aspect,pix_fmt);
2290 //until then pix_fmt may be changed right after codec init
2291 if( avctx
->pix_fmt
== PIX_FMT_XVMC_MPEG2_IDCT
)
2292 avctx
->idct_algo
= FF_IDCT_SIMPLE
;
2294 if (MPV_common_init(s
) < 0)
2296 s1
->mpeg_enc_ctx_allocated
= 1;
2299 skip_bits(&s
->gb
, 10); /* vbv_buffer_size */
2300 skip_bits(&s
->gb
, 1);
2303 if (get_bits1(&s
->gb
)) {
2305 v
= get_bits(&s
->gb
, 8);
2306 j
= s
->intra_scantable
.permutated
[i
];
2307 s
->intra_matrix
[j
] = v
;
2308 s
->chroma_intra_matrix
[j
] = v
;
2311 dprintf("intra matrix present\n");
2313 dprintf(" %d", s
->intra_matrix
[s
->intra_scantable
.permutated
[i
]]);
2318 int j
= s
->dsp
.idct_permutation
[i
];
2319 v
= ff_mpeg1_default_intra_matrix
[i
];
2320 s
->intra_matrix
[j
] = v
;
2321 s
->chroma_intra_matrix
[j
] = v
;
2324 if (get_bits1(&s
->gb
)) {
2326 v
= get_bits(&s
->gb
, 8);
2327 j
= s
->intra_scantable
.permutated
[i
];
2328 s
->inter_matrix
[j
] = v
;
2329 s
->chroma_inter_matrix
[j
] = v
;
2332 dprintf("non intra matrix present\n");
2334 dprintf(" %d", s
->inter_matrix
[s
->intra_scantable
.permutated
[i
]]);
2339 int j
= s
->dsp
.idct_permutation
[i
];
2340 v
= ff_mpeg1_default_non_intra_matrix
[i
];
2341 s
->inter_matrix
[j
] = v
;
2342 s
->chroma_inter_matrix
[j
] = v
;
2346 /* we set mpeg2 parameters so that it emulates mpeg1 */
2347 s
->progressive_sequence
= 1;
2348 s
->progressive_frame
= 1;
2349 s
->picture_structure
= PICT_FRAME
;
2350 s
->frame_pred_frame_dct
= 1;
2351 s
->codec_id
= s
->avctx
->codec_id
= CODEC_ID_MPEG1VIDEO
;
2352 avctx
->sub_id
= 1; /* indicates mpeg1 */
2356 static int vcr2_init_sequence(AVCodecContext
*avctx
)
2358 Mpeg1Context
*s1
= avctx
->priv_data
;
2359 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
2362 /* start new mpeg1 context decoding */
2363 s
->out_format
= FMT_MPEG1
;
2364 if (s1
->mpeg_enc_ctx_allocated
) {
2367 s
->width
= avctx
->width
;
2368 s
->height
= avctx
->height
;
2369 avctx
->has_b_frames
= 0; //true?
2373 //get_format() or set_video(width,height,aspect,pix_fmt);
2374 //until then pix_fmt may be changed right after codec init
2375 if( avctx
->pix_fmt
== PIX_FMT_XVMC_MPEG2_IDCT
)
2376 avctx
->idct_algo
= FF_IDCT_SIMPLE
;
2378 if (MPV_common_init(s
) < 0)
2380 s1
->mpeg_enc_ctx_allocated
= 1;
2383 int j
= s
->dsp
.idct_permutation
[i
];
2384 v
= ff_mpeg1_default_intra_matrix
[i
];
2385 s
->intra_matrix
[j
] = v
;
2386 s
->chroma_intra_matrix
[j
] = v
;
2388 v
= ff_mpeg1_default_non_intra_matrix
[i
];
2389 s
->inter_matrix
[j
] = v
;
2390 s
->chroma_inter_matrix
[j
] = v
;
2393 s
->progressive_sequence
= 1;
2394 s
->progressive_frame
= 1;
2395 s
->picture_structure
= PICT_FRAME
;
2396 s
->frame_pred_frame_dct
= 1;
2397 s
->codec_id
= s
->avctx
->codec_id
= CODEC_ID_MPEG2VIDEO
;
2398 avctx
->sub_id
= 2; /* indicates mpeg2 */
2403 static void mpeg_decode_user_data(AVCodecContext
*avctx
,
2404 const uint8_t *buf
, int buf_size
)
2411 /* we parse the DTG active format information */
2413 p
[0] == 'D' && p
[1] == 'T' && p
[2] == 'G' && p
[3] == '1') {
2427 avctx
->dtg_active_format
= p
[0] & 0x0f;
2433 * finds the end of the current frame in the bitstream.
2434 * @return the position of the first byte of the next frame, or -1
2436 static int mpeg1_find_frame_end(MpegEncContext
*s
, uint8_t *buf
, int buf_size
){
2437 ParseContext
*pc
= &s
->parse_context
;
2444 if(!pc
->frame_start_found
){
2445 for(i
=0; i
<buf_size
; i
++){
2446 state
= (state
<<8) | buf
[i
];
2447 if(state
>= SLICE_MIN_START_CODE
&& state
<= SLICE_MAX_START_CODE
){
2449 pc
->frame_start_found
=1;
2455 if(pc
->frame_start_found
){
2456 for(; i
<buf_size
; i
++){
2457 state
= (state
<<8) | buf
[i
];
2458 if((state
&0xFFFFFF00) == 0x100){
2459 if(state
< SLICE_MIN_START_CODE
|| state
> SLICE_MAX_START_CODE
){
2460 pc
->frame_start_found
=0;
2468 return END_NOT_FOUND
;
2471 /* handle buffering and image synchronisation */
2472 static int mpeg_decode_frame(AVCodecContext
*avctx
,
2473 void *data
, int *data_size
,
2474 uint8_t *buf
, int buf_size
)
2476 Mpeg1Context
*s
= avctx
->priv_data
;
2477 uint8_t *buf_end
, *buf_ptr
;
2478 int ret
, start_code
, input_size
;
2479 AVFrame
*picture
= data
;
2480 MpegEncContext
*s2
= &s
->mpeg_enc_ctx
;
2481 dprintf("fill_buffer\n");
2485 /* special case for last picture */
2486 if (buf_size
== 0 && s2
->low_delay
==0 && s2
->next_picture_ptr
) {
2487 *picture
= *(AVFrame
*)s2
->next_picture_ptr
;
2488 s2
->next_picture_ptr
= NULL
;
2490 *data_size
= sizeof(AVFrame
);
2494 if(s2
->flags
&CODEC_FLAG_TRUNCATED
){
2495 int next
= mpeg1_find_frame_end(s2
, buf
, buf_size
);
2497 if( ff_combine_frame(s2
, next
, &buf
, &buf_size
) < 0 )
2502 buf_end
= buf
+ buf_size
;
2505 if (s
->repeat_field
% 2 == 1) {
2507 //fprintf(stderr,"\nRepeating last frame: %d -> %d! pict: %d %d", avctx->frame_number-1, avctx->frame_number,
2508 // s2->picture_number, s->repeat_field);
2509 if (avctx
->flags
& CODEC_FLAG_REPEAT_FIELD
) {
2510 *data_size
= sizeof(AVPicture
);
2516 if(s
->mpeg_enc_ctx_allocated
==0 && avctx
->codec_tag
== ff_get_fourcc("VCR2"))
2517 vcr2_init_sequence(avctx
);
2520 /* find start next code */
2521 start_code
= find_start_code(&buf_ptr
, buf_end
);
2522 if (start_code
< 0){
2523 if(s2
->pict_type
!= B_TYPE
|| avctx
->hurry_up
==0){
2524 if (slice_end(avctx
, picture
)) {
2525 if(s2
->last_picture_ptr
) //FIXME merge with the stuff in mpeg_decode_slice
2526 *data_size
= sizeof(AVPicture
);
2529 return FFMAX(0, buf_ptr
- buf
- s2
->parse_context
.last_index
);
2532 input_size
= buf_end
- buf_ptr
;
2534 if(avctx
->debug
& FF_DEBUG_STARTCODE
){
2535 printf("%3X at %d left %d\n", start_code
, buf_ptr
-buf
, input_size
);
2538 /* prepare data for next start code */
2539 switch(start_code
) {
2540 case SEQ_START_CODE
:
2541 mpeg1_decode_sequence(avctx
, buf_ptr
,
2545 case PICTURE_START_CODE
:
2546 /* we have a complete image : we try to decompress it */
2547 mpeg1_decode_picture(avctx
,
2548 buf_ptr
, input_size
);
2550 case EXT_START_CODE
:
2551 mpeg_decode_extension(avctx
,
2552 buf_ptr
, input_size
);
2554 case USER_START_CODE
:
2555 mpeg_decode_user_data(avctx
,
2556 buf_ptr
, input_size
);
2558 case GOP_START_CODE
:
2562 if (start_code
>= SLICE_MIN_START_CODE
&&
2563 start_code
<= SLICE_MAX_START_CODE
) {
2565 /* skip b frames if we dont have reference frames */
2566 if(s2
->last_picture_ptr
==NULL
&& s2
->pict_type
==B_TYPE
) break;
2567 /* skip b frames if we are in a hurry */
2568 if(avctx
->hurry_up
&& s2
->pict_type
==B_TYPE
) break;
2569 /* skip everything if we are in a hurry>=5 */
2570 if(avctx
->hurry_up
>=5) break;
2572 if (!s
->mpeg_enc_ctx_allocated
) break;
2574 ret
= mpeg_decode_slice(avctx
, picture
,
2575 start_code
, &buf_ptr
, input_size
);
2579 if(s2
->resync_mb_x
>=0 && s2
->resync_mb_y
>=0)
2580 ff_er_add_slice(s2
, s2
->resync_mb_x
, s2
->resync_mb_y
, s2
->mb_x
, s2
->mb_y
, AC_ERROR
|DC_ERROR
|MV_ERROR
);
2581 if(ret
==DECODE_SLICE_FATAL_ERROR
) return -1;
2583 ff_er_add_slice(s2
, s2
->resync_mb_x
, s2
->resync_mb_y
, s2
->mb_x
-1, s2
->mb_y
, AC_END
|DC_END
|MV_END
);
2591 static int mpeg_decode_end(AVCodecContext
*avctx
)
2593 Mpeg1Context
*s
= avctx
->priv_data
;
2595 if (s
->mpeg_enc_ctx_allocated
)
2596 MPV_common_end(&s
->mpeg_enc_ctx
);
2600 AVCodec mpeg1video_decoder
= {
2603 CODEC_ID_MPEG1VIDEO
,
2604 sizeof(Mpeg1Context
),
2609 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
| CODEC_CAP_TRUNCATED
,
2610 .flush
= ff_mpeg_flush
,
2613 AVCodec mpeg2video_decoder
= {
2616 CODEC_ID_MPEG2VIDEO
,
2617 sizeof(Mpeg1Context
),
2622 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
| CODEC_CAP_TRUNCATED
,
2623 .flush
= ff_mpeg_flush
,
2627 static int mpeg_mc_decode_init(AVCodecContext
*avctx
){
2630 if( !(avctx
->slice_flags
& SLICE_FLAG_CODED_ORDER
) )
2632 if( !(avctx
->slice_flags
& SLICE_FLAG_ALLOW_FIELD
) )
2633 dprintf("mpeg12.c: XvMC decoder will work better if SLICE_FLAG_ALLOW_FIELD is set\n");
2635 mpeg_decode_init(avctx
);
2636 s
= avctx
->priv_data
;
2638 avctx
->pix_fmt
= PIX_FMT_XVMC_MPEG2_IDCT
;
2639 avctx
->xvmc_acceleration
= 1;
2644 AVCodec mpeg_xvmc_decoder
= {
2647 CODEC_ID_MPEG2VIDEO_XVMC
,
2648 sizeof(Mpeg1Context
),
2649 mpeg_mc_decode_init
,
2653 CODEC_CAP_DRAW_HORIZ_BAND
| CODEC_CAP_DR1
| CODEC_CAP_TRUNCATED
,
2658 /* this is ugly i know, but the alternative is too make
2659 hundreds of vars global and prefix them with ff_mpeg1_
2660 which is far uglier. */