2 * MPEG1 encoder / 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
22 #include "mpegvideo.h"
24 #include "mpeg12data.h"
27 #define SEQ_END_CODE 0x000001b7
28 #define SEQ_START_CODE 0x000001b3
29 #define GOP_START_CODE 0x000001b8
30 #define PICTURE_START_CODE 0x00000100
31 #define SLICE_MIN_START_CODE 0x00000101
32 #define SLICE_MAX_START_CODE 0x000001af
33 #define EXT_START_CODE 0x000001b5
34 #define USER_START_CODE 0x000001b2
36 static void mpeg1_encode_block(MpegEncContext
*s
,
39 static void mpeg1_encode_motion(MpegEncContext
*s
, int val
);
40 static void mpeg1_skip_picture(MpegEncContext
*s
, int pict_num
);
41 static int mpeg1_decode_block(MpegEncContext
*s
,
44 static int mpeg2_decode_block_non_intra(MpegEncContext
*s
,
47 static int mpeg2_decode_block_intra(MpegEncContext
*s
,
50 static int mpeg_decode_motion(MpegEncContext
*s
, int fcode
, int pred
);
52 static UINT16 mv_penalty
[MAX_FCODE
+1][MAX_MV
*2+1];
53 static UINT8 fcode_tab
[MAX_MV
*2+1];
55 static void put_header(MpegEncContext
*s
, int header
)
57 align_put_bits(&s
->pb
);
58 put_bits(&s
->pb
, 16, header
>>16);
59 put_bits(&s
->pb
, 16, header
&0xFFFF);
62 /* put sequence header if needed */
63 static void mpeg1_encode_sequence_header(MpegEncContext
*s
)
65 unsigned int vbv_buffer_size
;
70 if (s
->picture_in_gop_number
== 0) {
71 /* mpeg1 header repeated every gop */
72 put_header(s
, SEQ_START_CODE
);
74 /* search closest frame rate */
77 s
->frame_rate_index
= 0;
80 d
= abs(s
->frame_rate
- frame_rate_tab
[i
]);
83 s
->frame_rate_index
= i
;
88 put_bits(&s
->pb
, 12, s
->width
);
89 put_bits(&s
->pb
, 12, s
->height
);
90 put_bits(&s
->pb
, 4, 1); /* 1/1 aspect ratio */
91 put_bits(&s
->pb
, 4, s
->frame_rate_index
);
92 v
= s
->bit_rate
/ 400;
95 put_bits(&s
->pb
, 18, v
);
96 put_bits(&s
->pb
, 1, 1); /* marker */
97 /* vbv buffer size: slightly greater than an I frame. We add
98 some margin just in case */
99 vbv_buffer_size
= (3 * s
->I_frame_bits
) / (2 * 8);
100 put_bits(&s
->pb
, 10, (vbv_buffer_size
+ 16383) / 16384);
101 put_bits(&s
->pb
, 1, 1); /* constrained parameter flag */
102 put_bits(&s
->pb
, 1, 0); /* no custom intra matrix */
103 put_bits(&s
->pb
, 1, 0); /* no custom non intra matrix */
105 put_header(s
, GOP_START_CODE
);
106 put_bits(&s
->pb
, 1, 0); /* do drop frame */
107 /* time code : we must convert from the real frame rate to a
108 fake mpeg frame rate in case of low frame rate */
109 fps
= frame_rate_tab
[s
->frame_rate_index
];
110 time_code
= (INT64
)s
->fake_picture_number
* FRAME_RATE_BASE
;
111 s
->gop_picture_number
= s
->fake_picture_number
;
112 put_bits(&s
->pb
, 5, (UINT32
)((time_code
/ (fps
* 3600)) % 24));
113 put_bits(&s
->pb
, 6, (UINT32
)((time_code
/ (fps
* 60)) % 60));
114 put_bits(&s
->pb
, 1, 1);
115 put_bits(&s
->pb
, 6, (UINT32
)((time_code
/ fps
) % 60));
116 put_bits(&s
->pb
, 6, (UINT32
)((time_code
% fps
) / FRAME_RATE_BASE
));
117 put_bits(&s
->pb
, 1, 1); /* closed gop */
118 put_bits(&s
->pb
, 1, 0); /* broken link */
121 if (s
->frame_rate
< (24 * FRAME_RATE_BASE
) && s
->picture_number
> 0) {
122 /* insert empty P pictures to slow down to the desired
123 frame rate. Each fake pictures takes about 20 bytes */
124 fps
= frame_rate_tab
[s
->frame_rate_index
];
125 n
= (((INT64
)s
->picture_number
* fps
) / s
->frame_rate
) - 1;
126 while (s
->fake_picture_number
< n
) {
127 mpeg1_skip_picture(s
, s
->fake_picture_number
-
128 s
->gop_picture_number
);
129 s
->fake_picture_number
++;
136 /* insert a fake P picture */
137 static void mpeg1_skip_picture(MpegEncContext
*s
, int pict_num
)
139 unsigned int mb_incr
;
141 /* mpeg1 picture header */
142 put_header(s
, PICTURE_START_CODE
);
143 /* temporal reference */
144 put_bits(&s
->pb
, 10, pict_num
& 0x3ff);
146 put_bits(&s
->pb
, 3, P_TYPE
);
147 put_bits(&s
->pb
, 16, 0xffff); /* non constant bit rate */
149 put_bits(&s
->pb
, 1, 1); /* integer coordinates */
150 put_bits(&s
->pb
, 3, 1); /* forward_f_code */
152 put_bits(&s
->pb
, 1, 0); /* extra bit picture */
155 put_header(s
, SLICE_MIN_START_CODE
);
156 put_bits(&s
->pb
, 5, 1); /* quantizer scale */
157 put_bits(&s
->pb
, 1, 0); /* slice extra information */
160 put_bits(&s
->pb
, mbAddrIncrTable
[mb_incr
- 1][1],
161 mbAddrIncrTable
[mb_incr
- 1][0]);
163 /* empty macroblock */
164 put_bits(&s
->pb
, 3, 1); /* motion only */
166 /* zero motion x & y */
167 put_bits(&s
->pb
, 1, 1);
168 put_bits(&s
->pb
, 1, 1);
170 /* output a number of empty slice */
171 mb_incr
= s
->mb_width
* s
->mb_height
- 1;
172 while (mb_incr
> 33) {
173 put_bits(&s
->pb
, 11, 0x008);
176 put_bits(&s
->pb
, mbAddrIncrTable
[mb_incr
- 1][1],
177 mbAddrIncrTable
[mb_incr
- 1][0]);
179 /* empty macroblock */
180 put_bits(&s
->pb
, 3, 1); /* motion only */
182 /* zero motion x & y */
183 put_bits(&s
->pb
, 1, 1);
184 put_bits(&s
->pb
, 1, 1);
187 void mpeg1_encode_picture_header(MpegEncContext
*s
, int picture_number
)
198 mpeg1_max_level
[0][i
]= rl_mpeg1
.max_level
[0][i
];
199 mpeg1_index_run
[0][i
]= rl_mpeg1
.index_run
[0][i
];
202 /* build unified dc encoding tables */
203 for(i
=-255; i
<256; i
++)
211 index
= vlc_dc_table
[adiff
];
213 bits
= vlc_dc_lum_bits
[index
] + index
;
214 code
= (vlc_dc_lum_code
[index
]<<index
) + (diff
& ((1 << index
) - 1));
215 mpeg1_lum_dc_uni
[i
+255]= bits
+ (code
<<8);
217 bits
= vlc_dc_chroma_bits
[index
] + index
;
218 code
= (vlc_dc_chroma_code
[index
]<<index
) + (diff
& ((1 << index
) - 1));
219 mpeg1_chr_dc_uni
[i
+255]= bits
+ (code
<<8);
222 mpeg1_encode_sequence_header(s
);
224 /* mpeg1 picture header */
225 put_header(s
, PICTURE_START_CODE
);
226 /* temporal reference */
227 put_bits(&s
->pb
, 10, (s
->fake_picture_number
-
228 s
->gop_picture_number
) & 0x3ff);
229 s
->fake_picture_number
++;
231 put_bits(&s
->pb
, 3, s
->pict_type
);
232 put_bits(&s
->pb
, 16, 0xffff); /* non constant bit rate */
234 if (s
->pict_type
== P_TYPE
) {
235 put_bits(&s
->pb
, 1, 0); /* half pel coordinates */
236 put_bits(&s
->pb
, 3, s
->f_code
); /* forward_f_code */
239 put_bits(&s
->pb
, 1, 0); /* extra bit picture */
242 put_header(s
, SLICE_MIN_START_CODE
);
243 put_bits(&s
->pb
, 5, s
->qscale
); /* quantizer scale */
244 put_bits(&s
->pb
, 1, 0); /* slice extra information */
247 void mpeg1_encode_mb(MpegEncContext
*s
,
248 DCTELEM block
[6][64],
249 int motion_x
, int motion_y
)
251 int mb_incr
, i
, cbp
, mb_x
, mb_y
;
259 if (s
->block_last_index
[i
] >= 0)
263 /* skip macroblock, except if first or last macroblock of a slice */
264 if ((cbp
| motion_x
| motion_y
) == 0 &&
265 (!((mb_x
| mb_y
) == 0 ||
266 (mb_x
== s
->mb_width
- 1 && mb_y
== s
->mb_height
- 1)))) {
270 mb_incr
= s
->mb_incr
;
272 while (mb_incr
> 33) {
273 put_bits(&s
->pb
, 11, 0x008);
276 put_bits(&s
->pb
, mbAddrIncrTable
[mb_incr
- 1][1],
277 mbAddrIncrTable
[mb_incr
- 1][0]);
279 if (s
->pict_type
== I_TYPE
) {
280 put_bits(&s
->pb
, 1, 1); /* macroblock_type : macroblock_quant = 0 */
283 put_bits(&s
->pb
, 5, 0x03);
286 if (motion_x
== 0 && motion_y
== 0) {
287 put_bits(&s
->pb
, 2, 1); /* macroblock_pattern only */
288 put_bits(&s
->pb
, mbPatTable
[cbp
- 1][1], mbPatTable
[cbp
- 1][0]);
290 put_bits(&s
->pb
, 1, 1); /* motion + cbp */
291 mpeg1_encode_motion(s
, motion_x
- s
->last_mv
[0][0][0]);
292 mpeg1_encode_motion(s
, motion_y
- s
->last_mv
[0][0][1]);
293 put_bits(&s
->pb
, mbPatTable
[cbp
- 1][1], mbPatTable
[cbp
- 1][0]);
296 put_bits(&s
->pb
, 3, 1); /* motion only */
297 mpeg1_encode_motion(s
, motion_x
- s
->last_mv
[0][0][0]);
298 mpeg1_encode_motion(s
, motion_y
- s
->last_mv
[0][0][1]);
303 if (cbp
& (1 << (5 - i
))) {
304 mpeg1_encode_block(s
, block
[i
], i
);
309 s
->last_mv
[0][0][0] = motion_x
;
310 s
->last_mv
[0][0][1] = motion_y
;
313 static void mpeg1_encode_motion(MpegEncContext
*s
, int val
)
315 int code
, bit_size
, l
, m
, bits
, range
, sign
;
321 mbMotionVectorTable
[0][1],
322 mbMotionVectorTable
[0][0]);
324 bit_size
= s
->f_code
- 1;
325 range
= 1 << bit_size
;
326 /* modulo encoding */
331 } else if (val
>= l
) {
337 code
= (val
>> bit_size
) + 1;
338 bits
= val
& (range
- 1);
343 code
= (val
>> bit_size
) + 1;
344 bits
= val
& (range
- 1);
348 mbMotionVectorTable
[code
][1],
349 mbMotionVectorTable
[code
][0]);
350 put_bits(&s
->pb
, 1, sign
);
352 put_bits(&s
->pb
, bit_size
, bits
);
357 void mpeg1_encode_init(MpegEncContext
*s
)
365 for(f_code
=1; f_code
<=MAX_FCODE
; f_code
++){
366 for(mv
=-MAX_MV
; mv
<=MAX_MV
; mv
++){
369 if(mv
==0) len
= mbMotionVectorTable
[0][1];
371 int val
, bit_size
, range
, code
;
373 bit_size
= s
->f_code
- 1;
374 range
= 1 << bit_size
;
380 code
= (val
>> bit_size
) + 1;
382 len
= mbMotionVectorTable
[code
][1] + 1 + bit_size
;
384 len
= mbMotionVectorTable
[16][1] + 2 + bit_size
;
388 mv_penalty
[f_code
][mv
+MAX_MV
]= len
;
393 for(f_code
=MAX_FCODE
; f_code
>0; f_code
--){
394 for(mv
=-(8<<f_code
); mv
<(8<<f_code
); mv
++){
395 fcode_tab
[mv
+MAX_MV
]= f_code
;
399 s
->mv_penalty
= mv_penalty
;
400 s
->fcode_tab
= fcode_tab
;
403 s
->intra_quant_bias
= 3<<(QUANT_BIAS_SHIFT
-3); //(a + x*3/8)/x
404 s
->inter_quant_bias
= 0;
407 static inline void encode_dc(MpegEncContext
*s
, int diff
, int component
)
409 if (component
== 0) {
412 mpeg1_lum_dc_uni
[diff
+255]&0xFF,
413 mpeg1_lum_dc_uni
[diff
+255]>>8);
417 mpeg1_chr_dc_uni
[diff
+255]&0xFF,
418 mpeg1_chr_dc_uni
[diff
+255]>>8);
422 static void mpeg1_encode_block(MpegEncContext
*s
,
426 int alevel
, level
, last_non_zero
, dc
, diff
, i
, j
, run
, last_index
, sign
;
428 // RLTable *rl = &rl_mpeg1;
430 last_index
= s
->block_last_index
[n
];
434 component
= (n
<= 3 ?
0 : n
- 4 + 1);
435 dc
= block
[0]; /* overflow is impossible */
436 diff
= dc
- s
->last_dc
[component
];
437 encode_dc(s
, diff
, component
);
438 s
->last_dc
[component
] = dc
;
441 /* encode the first coefficient : needs to be done here because
442 it is handled slightly differently */
444 if (abs(level
) == 1) {
445 code
= ((UINT32
)level
>> 31); /* the sign bit */
446 put_bits(&s
->pb
, 2, code
| 0x02);
455 /* now quantify & encode AC coefs */
456 last_non_zero
= i
- 1;
458 for(;i
<=last_index
;i
++) {
459 j
= zigzag_direct
[i
];
464 dprintf("level[%d]=%d\n", i
, level
);
466 /* encode using VLC */
468 run
= i
- last_non_zero
- 1;
478 : "=&r" (alevel
), "=&r" (sign
)
489 // code = get_rl_index(rl, 0, run, alevel);
490 if (alevel
> mpeg1_max_level
[0][run
])
493 code
= mpeg1_index_run
[0][run
] + alevel
- 1;
495 if (code
< 111 /* rl->n */) {
496 /* store the vlc & sign at once */
497 put_bits(&s
->pb
, mpeg1_vlc
[code
][1]+1, (mpeg1_vlc
[code
][0]<<1) + sign
);
499 /* escape seems to be pretty rare <5% so i dont optimize it */
500 put_bits(&s
->pb
, mpeg1_vlc
[111/*rl->n*/][1], mpeg1_vlc
[111/*rl->n*/][0]);
501 /* escape: only clip in this case */
502 put_bits(&s
->pb
, 6, run
);
504 put_bits(&s
->pb
, 8, level
& 0xff);
507 put_bits(&s
->pb
, 16, 0x8001 + level
+ 255);
509 put_bits(&s
->pb
, 16, level
& 0xffff);
517 put_bits(&s
->pb
, 2, 0x2);
520 /******************************************/
523 static VLC dc_lum_vlc
;
524 static VLC dc_chroma_vlc
;
526 static VLC mbincr_vlc
;
527 static VLC mb_ptype_vlc
;
528 static VLC mb_btype_vlc
;
529 static VLC mb_pat_vlc
;
531 void mpeg1_init_vlc(MpegEncContext
*s
)
537 init_vlc(&dc_lum_vlc
, 9, 12,
538 vlc_dc_lum_bits
, 1, 1,
539 vlc_dc_lum_code
, 2, 2);
540 init_vlc(&dc_chroma_vlc
, 9, 12,
541 vlc_dc_chroma_bits
, 1, 1,
542 vlc_dc_chroma_code
, 2, 2);
543 init_vlc(&mv_vlc
, 9, 17,
544 &mbMotionVectorTable
[0][1], 2, 1,
545 &mbMotionVectorTable
[0][0], 2, 1);
546 init_vlc(&mbincr_vlc
, 9, 35,
547 &mbAddrIncrTable
[0][1], 2, 1,
548 &mbAddrIncrTable
[0][0], 2, 1);
549 init_vlc(&mb_pat_vlc
, 9, 63,
550 &mbPatTable
[0][1], 2, 1,
551 &mbPatTable
[0][0], 2, 1);
553 init_vlc(&mb_ptype_vlc
, 6, 32,
554 &table_mb_ptype
[0][1], 2, 1,
555 &table_mb_ptype
[0][0], 2, 1);
556 init_vlc(&mb_btype_vlc
, 6, 32,
557 &table_mb_btype
[0][1], 2, 1,
558 &table_mb_btype
[0][0], 2, 1);
561 /* cannot use generic init because we must add the EOB code */
562 init_vlc(&rl_mpeg1
.vlc
, 9, rl_mpeg1
.n
+ 2,
563 &rl_mpeg1
.table_vlc
[0][1], 4, 2,
564 &rl_mpeg1
.table_vlc
[0][0], 4, 2);
565 init_vlc(&rl_mpeg2
.vlc
, 9, rl_mpeg2
.n
+ 2,
566 &rl_mpeg2
.table_vlc
[0][1], 4, 2,
567 &rl_mpeg2
.table_vlc
[0][0], 4, 2);
571 static inline int get_dmv(MpegEncContext
*s
)
573 if(get_bits1(&s
->gb
))
574 return 1 - (get_bits1(&s
->gb
) << 1);
579 static inline int get_qscale(MpegEncContext
*s
)
583 if (s
->q_scale_type
) {
584 qscale
= non_linear_qscale
[get_bits(&s
->gb
, 5)];
586 qscale
= get_bits(&s
->gb
, 5) << 1;
589 /* for mpeg1, we use the generic unquant code */
590 qscale
= get_bits(&s
->gb
, 5);
595 /* motion type (for mpeg2) */
601 static int mpeg_decode_mb(MpegEncContext
*s
,
602 DCTELEM block
[6][64])
604 int i
, j
, k
, cbp
, val
, code
, mb_type
, motion_type
;
606 /* skip mb handling */
607 if (s
->mb_incr
== 0) {
608 /* read again increment */
611 code
= get_vlc(&s
->gb
, &mbincr_vlc
);
613 return 1; /* error = end of slice */
618 /* otherwise, stuffing, nothing to do */
625 if (++s
->mb_x
>= s
->mb_width
) {
627 if (s
->mb_y
>= (s
->mb_height
- 1))
631 dprintf("decode_mb: x=%d y=%d\n", s
->mb_x
, s
->mb_y
);
633 if (--s
->mb_incr
!= 0) {
637 s
->block_last_index
[i
] = -1;
638 s
->mv_type
= MV_TYPE_16X16
;
639 if (s
->pict_type
== P_TYPE
) {
640 /* if P type, zero motion vector is implied */
641 s
->mv_dir
= MV_DIR_FORWARD
;
642 s
->mv
[0][0][0] = s
->mv
[0][0][1] = 0;
643 s
->last_mv
[0][0][0] = s
->last_mv
[0][0][1] = 0;
644 s
->last_mv
[0][1][0] = s
->last_mv
[0][1][1] = 0;
646 /* if B type, reuse previous vectors and directions */
647 s
->mv
[0][0][0] = s
->last_mv
[0][0][0];
648 s
->mv
[0][0][1] = s
->last_mv
[0][0][1];
649 s
->mv
[1][0][0] = s
->last_mv
[1][0][0];
650 s
->mv
[1][0][1] = s
->last_mv
[1][0][1];
656 switch(s
->pict_type
) {
659 if (get_bits1(&s
->gb
) == 0) {
660 if (get_bits1(&s
->gb
) == 0)
662 mb_type
= MB_QUANT
| MB_INTRA
;
668 mb_type
= get_vlc(&s
->gb
, &mb_ptype_vlc
);
673 mb_type
= get_vlc(&s
->gb
, &mb_btype_vlc
);
678 dprintf("mb_type=%x\n", mb_type
);
679 motion_type
= 0; /* avoid warning */
680 if (mb_type
& (MB_FOR
|MB_BACK
)) {
681 /* get additionnal motion vector type */
682 if (s
->picture_structure
== PICT_FRAME
&& s
->frame_pred_frame_dct
)
683 motion_type
= MT_FRAME
;
685 motion_type
= get_bits(&s
->gb
, 2);
687 /* compute dct type */
688 if (s
->picture_structure
== PICT_FRAME
&&
689 !s
->frame_pred_frame_dct
&&
690 (mb_type
& (MB_PAT
| MB_INTRA
))) {
691 s
->interlaced_dct
= get_bits1(&s
->gb
);
693 if (s
->interlaced_dct
)
694 printf("interlaced_dct\n");
697 s
->interlaced_dct
= 0; /* frame based */
700 if (mb_type
& MB_QUANT
) {
701 s
->qscale
= get_qscale(s
);
703 if (mb_type
& MB_INTRA
) {
704 if (s
->concealment_motion_vectors
) {
705 /* just parse them */
706 if (s
->picture_structure
!= PICT_FRAME
)
707 skip_bits1(&s
->gb
); /* field select */
708 mpeg_decode_motion(s
, s
->mpeg_f_code
[0][0], 0);
709 mpeg_decode_motion(s
, s
->mpeg_f_code
[0][1], 0);
713 memset(s
->last_mv
, 0, sizeof(s
->last_mv
)); /* reset mv prediction */
718 /* special case of implicit zero motion vector */
719 if (s
->pict_type
== P_TYPE
&& !(mb_type
& MB_FOR
)) {
720 s
->mv_dir
= MV_DIR_FORWARD
;
721 s
->mv_type
= MV_TYPE_16X16
;
722 s
->last_mv
[0][0][0] = 0;
723 s
->last_mv
[0][0][1] = 0;
724 s
->last_mv
[0][1][0] = 0;
725 s
->last_mv
[0][1][1] = 0;
728 } else if (mb_type
& (MB_FOR
| MB_BACK
)) {
732 if (mb_type
& (MB_FOR
>> i
)) {
733 s
->mv_dir
|= (MV_DIR_FORWARD
>> i
);
734 dprintf("motion_type=%d\n", motion_type
);
735 switch(motion_type
) {
736 case MT_FRAME
: /* or MT_16X8 */
737 if (s
->picture_structure
== PICT_FRAME
) {
739 s
->mv_type
= MV_TYPE_16X16
;
741 val
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][k
],
742 s
->last_mv
[i
][0][k
]);
743 s
->last_mv
[i
][0][k
] = val
;
744 s
->last_mv
[i
][1][k
] = val
;
745 /* full_pel: only for mpeg1 */
748 s
->mv
[i
][0][k
] = val
;
749 dprintf("mv%d: %d\n", k
, val
);
753 s
->mv_type
= MV_TYPE_16X8
;
755 s
->field_select
[i
][j
] = get_bits1(&s
->gb
);
757 val
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][k
],
758 s
->last_mv
[i
][j
][k
]);
759 s
->last_mv
[i
][j
][k
] = val
;
760 s
->mv
[i
][j
][k
] = val
;
766 if (s
->picture_structure
== PICT_FRAME
) {
767 s
->mv_type
= MV_TYPE_FIELD
;
769 s
->field_select
[i
][j
] = get_bits1(&s
->gb
);
770 val
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][0],
771 s
->last_mv
[i
][j
][0]);
772 s
->last_mv
[i
][j
][0] = val
;
773 s
->mv
[i
][j
][0] = val
;
774 dprintf("fmx=%d\n", val
);
775 val
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][1],
776 s
->last_mv
[i
][j
][1] >> 1);
777 s
->last_mv
[i
][j
][1] = val
<< 1;
778 s
->mv
[i
][j
][1] = val
;
779 dprintf("fmy=%d\n", val
);
782 s
->mv_type
= MV_TYPE_16X16
;
783 s
->field_select
[i
][0] = get_bits1(&s
->gb
);
785 val
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][k
],
786 s
->last_mv
[i
][0][k
]);
787 s
->last_mv
[i
][0][k
] = val
;
788 s
->last_mv
[i
][1][k
] = val
;
789 s
->mv
[i
][0][k
] = val
;
795 int dmx
, dmy
, mx
, my
, m
;
797 mx
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][0],
798 s
->last_mv
[i
][0][0]);
799 s
->last_mv
[i
][0][0] = mx
;
800 s
->last_mv
[i
][1][0] = mx
;
802 my
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][1],
803 s
->last_mv
[i
][0][1] >> 1);
805 s
->mv_type
= MV_TYPE_DMV
;
806 /* XXX: totally broken */
807 if (s
->picture_structure
== PICT_FRAME
) {
808 s
->last_mv
[i
][0][1] = my
<< 1;
809 s
->last_mv
[i
][1][1] = my
<< 1;
811 m
= s
->top_field_first ?
1 : 3;
812 /* top -> top pred */
814 s
->mv
[i
][0][1] = my
<< 1;
815 s
->mv
[i
][1][0] = ((mx
* m
+ (mx
> 0)) >> 1) + dmx
;
816 s
->mv
[i
][1][1] = ((my
* m
+ (my
> 0)) >> 1) + dmy
- 1;
819 s
->mv
[i
][2][1] = my
<< 1;
820 s
->mv
[i
][3][0] = ((mx
* m
+ (mx
> 0)) >> 1) + dmx
;
821 s
->mv
[i
][3][1] = ((my
* m
+ (my
> 0)) >> 1) + dmy
+ 1;
823 s
->last_mv
[i
][0][1] = my
;
824 s
->last_mv
[i
][1][1] = my
;
827 s
->mv
[i
][1][0] = ((mx
+ (mx
> 0)) >> 1) + dmx
;
828 s
->mv
[i
][1][1] = ((my
+ (my
> 0)) >> 1) + dmy
- 1
829 /* + 2 * cur_field */;
838 if ((mb_type
& MB_INTRA
) && s
->concealment_motion_vectors
) {
839 skip_bits1(&s
->gb
); /* marker */
842 if (mb_type
& MB_PAT
) {
843 cbp
= get_vlc(&s
->gb
, &mb_pat_vlc
);
848 dprintf("cbp=%x\n", cbp
);
853 if (cbp
& (1 << (5 - i
))) {
854 if (mpeg2_decode_block_intra(s
, block
[i
], i
) < 0)
857 s
->block_last_index
[i
] = -1;
862 if (cbp
& (1 << (5 - i
))) {
863 if (mpeg2_decode_block_non_intra(s
, block
[i
], i
) < 0)
866 s
->block_last_index
[i
] = -1;
872 if (cbp
& (1 << (5 - i
))) {
873 if (mpeg1_decode_block(s
, block
[i
], i
) < 0)
876 s
->block_last_index
[i
] = -1;
883 /* as h263, but only 17 codes */
884 static int mpeg_decode_motion(MpegEncContext
*s
, int fcode
, int pred
)
886 int code
, sign
, val
, m
, l
, shift
;
888 code
= get_vlc(&s
->gb
, &mv_vlc
);
895 sign
= get_bits1(&s
->gb
);
897 val
= (code
- 1) << shift
;
899 val
|= get_bits(&s
->gb
, shift
);
905 /* modulo decoding */
906 l
= (1 << shift
) * 16;
910 } else if (val
>= l
) {
916 static inline int decode_dc(MpegEncContext
*s
, int component
)
920 if (component
== 0) {
921 code
= get_vlc(&s
->gb
, &dc_lum_vlc
);
923 code
= get_vlc(&s
->gb
, &dc_chroma_vlc
);
930 diff
= get_bits(&s
->gb
, code
);
931 if ((diff
& (1 << (code
- 1))) == 0)
932 diff
= (-1 << code
) | (diff
+ 1);
937 static int mpeg1_decode_block(MpegEncContext
*s
,
941 int level
, dc
, diff
, i
, j
, run
;
943 RLTable
*rl
= &rl_mpeg1
;
947 component
= (n
<= 3 ?
0 : n
- 4 + 1);
948 diff
= decode_dc(s
, component
);
951 dc
= s
->last_dc
[component
];
953 s
->last_dc
[component
] = dc
;
955 dprintf("dc=%d diff=%d\n", dc
, diff
);
962 /* special case for the first coef. no need to add a second vlc table */
964 SHOW_BITS(&s
->gb
, v
, 2);
967 level
= 1 - ((v
& 1) << 1);
969 RESTORE_BITS(&s
->gb
);
972 RESTORE_BITS(&s
->gb
);
975 /* now quantify & encode AC coefs */
977 code
= get_vlc(&s
->gb
, &rl
->vlc
);
983 } else if (code
== 111) {
985 run
= get_bits(&s
->gb
, 6);
986 level
= get_bits(&s
->gb
, 8);
987 level
= (level
<< 24) >> 24;
989 level
= get_bits(&s
->gb
, 8) - 256;
990 } else if (level
== 0) {
991 level
= get_bits(&s
->gb
, 8);
994 run
= rl
->table_run
[code
];
995 level
= rl
->table_level
[code
];
996 if (get_bits1(&s
->gb
))
1003 dprintf("%d: run=%d level=%d\n", n
, run
, level
);
1004 j
= zigzag_direct
[i
];
1008 s
->block_last_index
[n
] = i
-1;
1012 /* Also does unquantization here, since I will never support mpeg2
1014 static int mpeg2_decode_block_non_intra(MpegEncContext
*s
,
1018 int level
, i
, j
, run
;
1020 RLTable
*rl
= &rl_mpeg1
;
1021 const UINT8
*scan_table
;
1022 const UINT16
*matrix
;
1025 if (s
->alternate_scan
)
1026 scan_table
= ff_alternate_vertical_scan
;
1028 scan_table
= zigzag_direct
;
1037 matrix
= s
->inter_matrix
;
1039 matrix
= s
->chroma_inter_matrix
;
1041 /* special case for the first coef. no need to add a second vlc table */
1043 SHOW_BITS(&s
->gb
, v
, 2);
1046 level
= 1 - ((v
& 1) << 1);
1048 RESTORE_BITS(&s
->gb
);
1051 RESTORE_BITS(&s
->gb
);
1054 /* now quantify & encode AC coefs */
1056 code
= get_vlc(&s
->gb
, &rl
->vlc
);
1061 } else if (code
== 111) {
1063 run
= get_bits(&s
->gb
, 6);
1064 level
= get_bits(&s
->gb
, 12);
1065 level
= (level
<< 20) >> 20;
1067 run
= rl
->table_run
[code
];
1068 level
= rl
->table_level
[code
];
1069 if (get_bits1(&s
->gb
))
1077 dprintf("%d: run=%d level=%d\n", n
, run
, level
);
1080 level
= ((level
* 2 + 1) * s
->qscale
* matrix
[j
]) >> 5;
1082 level
= ((-level
* 2 + 1) * s
->qscale
* matrix
[j
]) >> 5;
1085 /* XXX: is it really necessary to saturate since the encoder
1086 knows whats going on ? */
1091 block
[63] ^= (mismatch
& 1);
1092 s
->block_last_index
[n
] = i
;
1096 static int mpeg2_decode_block_intra(MpegEncContext
*s
,
1100 int level
, dc
, diff
, i
, j
, run
;
1101 int code
, component
;
1103 const UINT8
*scan_table
;
1104 const UINT16
*matrix
;
1107 if (s
->alternate_scan
)
1108 scan_table
= ff_alternate_vertical_scan
;
1110 scan_table
= zigzag_direct
;
1113 component
= (n
<= 3 ?
0 : n
- 4 + 1);
1114 diff
= decode_dc(s
, component
);
1117 dc
= s
->last_dc
[component
];
1119 s
->last_dc
[component
] = dc
;
1120 block
[0] = dc
<< (3 - s
->intra_dc_precision
);
1121 dprintf("dc=%d\n", block
[0]);
1122 mismatch
= block
[0] ^ 1;
1124 if (s
->intra_vlc_format
)
1129 matrix
= s
->intra_matrix
;
1131 matrix
= s
->chroma_intra_matrix
;
1133 /* now quantify & encode AC coefs */
1135 code
= get_vlc(&s
->gb
, &rl
->vlc
);
1140 } else if (code
== 111) {
1142 run
= get_bits(&s
->gb
, 6);
1143 level
= get_bits(&s
->gb
, 12);
1144 level
= (level
<< 20) >> 20;
1146 run
= rl
->table_run
[code
];
1147 level
= rl
->table_level
[code
];
1148 if (get_bits1(&s
->gb
))
1155 dprintf("%d: run=%d level=%d\n", n
, run
, level
);
1156 level
= (level
* s
->qscale
* matrix
[j
]) / 16;
1157 /* XXX: is it really necessary to saturate since the encoder
1158 knows whats going on ? */
1163 block
[63] ^= (mismatch
& 1);
1164 s
->block_last_index
[n
] = i
;
1168 /* compressed picture size */
1169 #define PICTURE_BUFFER_SIZE 100000
1171 typedef struct Mpeg1Context
{
1172 MpegEncContext mpeg_enc_ctx
;
1173 UINT32 header_state
;
1174 int start_code
; /* current start code */
1175 UINT8 buffer
[PICTURE_BUFFER_SIZE
];
1178 int mpeg_enc_ctx_allocated
; /* true if decoding context allocated */
1179 int repeat_field
; /* true if we must repeat the field */
1182 static int mpeg_decode_init(AVCodecContext
*avctx
)
1184 Mpeg1Context
*s
= avctx
->priv_data
;
1186 s
->header_state
= 0xff;
1187 s
->mpeg_enc_ctx_allocated
= 0;
1188 s
->buffer_size
= PICTURE_BUFFER_SIZE
;
1190 s
->buf_ptr
= s
->buffer
;
1191 s
->mpeg_enc_ctx
.picture_number
= 0;
1192 s
->repeat_field
= 0;
1193 s
->mpeg_enc_ctx
.codec_id
= avctx
->codec
->id
;
1194 avctx
->mbskip_table
= s
->mpeg_enc_ctx
.mbskip_table
;
1195 s
->mpeg_enc_ctx
.flags
= avctx
->flags
;
1199 /* return the 8 bit start code value and update the search
1200 state. Return -1 if no start code found */
1201 static int find_start_code(UINT8
**pbuf_ptr
, UINT8
*buf_end
,
1202 UINT32
*header_state
)
1205 unsigned int state
, v
;
1208 state
= *header_state
;
1209 buf_ptr
= *pbuf_ptr
;
1210 while (buf_ptr
< buf_end
) {
1212 if (state
== 0x000001) {
1213 state
= ((state
<< 8) | v
) & 0xffffff;
1217 state
= ((state
<< 8) | v
) & 0xffffff;
1221 *pbuf_ptr
= buf_ptr
;
1222 *header_state
= state
;
1226 static int mpeg1_decode_picture(AVCodecContext
*avctx
,
1227 UINT8
*buf
, int buf_size
)
1229 Mpeg1Context
*s1
= avctx
->priv_data
;
1230 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
1233 init_get_bits(&s
->gb
, buf
, buf_size
);
1235 ref
= get_bits(&s
->gb
, 10); /* temporal ref */
1236 s
->pict_type
= get_bits(&s
->gb
, 3);
1237 dprintf("pict_type=%d number=%d\n", s
->pict_type
, s
->picture_number
);
1238 skip_bits(&s
->gb
, 16);
1239 if (s
->pict_type
== P_TYPE
|| s
->pict_type
== B_TYPE
) {
1240 s
->full_pel
[0] = get_bits1(&s
->gb
);
1241 f_code
= get_bits(&s
->gb
, 3);
1244 s
->mpeg_f_code
[0][0] = f_code
;
1245 s
->mpeg_f_code
[0][1] = f_code
;
1247 if (s
->pict_type
== B_TYPE
) {
1248 s
->full_pel
[1] = get_bits1(&s
->gb
);
1249 f_code
= get_bits(&s
->gb
, 3);
1252 s
->mpeg_f_code
[1][0] = f_code
;
1253 s
->mpeg_f_code
[1][1] = f_code
;
1261 static void mpeg_decode_sequence_extension(MpegEncContext
*s
)
1263 int horiz_size_ext
, vert_size_ext
;
1264 int bit_rate_ext
, vbv_buf_ext
, low_delay
;
1265 int frame_rate_ext_n
, frame_rate_ext_d
;
1267 skip_bits(&s
->gb
, 8); /* profil and level */
1268 s
->progressive_sequence
= get_bits1(&s
->gb
); /* progressive_sequence */
1269 skip_bits(&s
->gb
, 2); /* chroma_format */
1270 horiz_size_ext
= get_bits(&s
->gb
, 2);
1271 vert_size_ext
= get_bits(&s
->gb
, 2);
1272 s
->width
|= (horiz_size_ext
<< 12);
1273 s
->height
|= (vert_size_ext
<< 12);
1274 bit_rate_ext
= get_bits(&s
->gb
, 12); /* XXX: handle it */
1275 s
->bit_rate
= ((s
->bit_rate
/ 400) | (bit_rate_ext
<< 12)) * 400;
1276 skip_bits1(&s
->gb
); /* marker */
1277 vbv_buf_ext
= get_bits(&s
->gb
, 8);
1278 low_delay
= get_bits1(&s
->gb
);
1279 frame_rate_ext_n
= get_bits(&s
->gb
, 2);
1280 frame_rate_ext_d
= get_bits(&s
->gb
, 5);
1281 if (frame_rate_ext_d
>= 1)
1282 s
->frame_rate
= (s
->frame_rate
* frame_rate_ext_n
) / frame_rate_ext_d
;
1283 dprintf("sequence extension\n");
1285 s
->avctx
->sub_id
= 2; /* indicates mpeg2 found */
1288 static void mpeg_decode_quant_matrix_extension(MpegEncContext
*s
)
1292 dprintf("matrix extension\n");
1294 if (get_bits1(&s
->gb
)) {
1296 v
= get_bits(&s
->gb
, 8);
1297 j
= zigzag_direct
[i
];
1298 s
->intra_matrix
[j
] = v
;
1299 s
->chroma_intra_matrix
[j
] = v
;
1302 if (get_bits1(&s
->gb
)) {
1304 v
= get_bits(&s
->gb
, 8);
1305 j
= zigzag_direct
[i
];
1306 s
->inter_matrix
[j
] = v
;
1307 s
->chroma_inter_matrix
[j
] = v
;
1310 if (get_bits1(&s
->gb
)) {
1312 v
= get_bits(&s
->gb
, 8);
1313 j
= zigzag_direct
[i
];
1314 s
->chroma_intra_matrix
[j
] = v
;
1317 if (get_bits1(&s
->gb
)) {
1319 v
= get_bits(&s
->gb
, 8);
1320 j
= zigzag_direct
[i
];
1321 s
->chroma_inter_matrix
[j
] = v
;
1326 static void mpeg_decode_picture_coding_extension(MpegEncContext
*s
)
1328 s
->full_pel
[0] = s
->full_pel
[1] = 0;
1329 s
->mpeg_f_code
[0][0] = get_bits(&s
->gb
, 4);
1330 s
->mpeg_f_code
[0][1] = get_bits(&s
->gb
, 4);
1331 s
->mpeg_f_code
[1][0] = get_bits(&s
->gb
, 4);
1332 s
->mpeg_f_code
[1][1] = get_bits(&s
->gb
, 4);
1333 s
->intra_dc_precision
= get_bits(&s
->gb
, 2);
1334 s
->picture_structure
= get_bits(&s
->gb
, 2);
1335 s
->top_field_first
= get_bits1(&s
->gb
);
1336 s
->frame_pred_frame_dct
= get_bits1(&s
->gb
);
1337 s
->concealment_motion_vectors
= get_bits1(&s
->gb
);
1338 s
->q_scale_type
= get_bits1(&s
->gb
);
1339 s
->intra_vlc_format
= get_bits1(&s
->gb
);
1340 s
->alternate_scan
= get_bits1(&s
->gb
);
1341 s
->repeat_first_field
= get_bits1(&s
->gb
);
1342 s
->chroma_420_type
= get_bits1(&s
->gb
);
1343 s
->progressive_frame
= get_bits1(&s
->gb
);
1344 /* composite display not parsed */
1345 dprintf("intra_dc_precision=%d\n", s
->intra_dc_precision
);
1346 dprintf("picture_structure=%d\n", s
->picture_structure
);
1347 dprintf("top field first=%d\n", s
->top_field_first
);
1348 dprintf("repeat first field=%d\n", s
->repeat_first_field
);
1349 dprintf("conceal=%d\n", s
->concealment_motion_vectors
);
1350 dprintf("intra_vlc_format=%d\n", s
->intra_vlc_format
);
1351 dprintf("alternate_scan=%d\n", s
->alternate_scan
);
1352 dprintf("frame_pred_frame_dct=%d\n", s
->frame_pred_frame_dct
);
1353 dprintf("progressive_frame=%d\n", s
->progressive_frame
);
1356 static void mpeg_decode_extension(AVCodecContext
*avctx
,
1357 UINT8
*buf
, int buf_size
)
1359 Mpeg1Context
*s1
= avctx
->priv_data
;
1360 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
1363 init_get_bits(&s
->gb
, buf
, buf_size
);
1365 ext_type
= get_bits(&s
->gb
, 4);
1369 mpeg_decode_sequence_extension(s
);
1372 /* quant matrix extension */
1373 mpeg_decode_quant_matrix_extension(s
);
1376 /* picture extension */
1377 mpeg_decode_picture_coding_extension(s
);
1382 /* return 1 if end of frame */
1383 static int mpeg_decode_slice(AVCodecContext
*avctx
,
1386 UINT8
*buf
, int buf_size
)
1388 Mpeg1Context
*s1
= avctx
->priv_data
;
1389 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
1392 start_code
= (start_code
- 1) & 0xff;
1393 if (start_code
>= s
->mb_height
)
1395 s
->last_dc
[0] = 1 << (7 + s
->intra_dc_precision
);
1396 s
->last_dc
[1] = s
->last_dc
[0];
1397 s
->last_dc
[2] = s
->last_dc
[0];
1398 memset(s
->last_mv
, 0, sizeof(s
->last_mv
));
1400 s
->mb_y
= start_code
;
1402 /* start frame decoding */
1403 if (s
->first_slice
) {
1408 init_get_bits(&s
->gb
, buf
, buf_size
);
1410 s
->qscale
= get_qscale(s
);
1411 /* extra slice info */
1412 while (get_bits1(&s
->gb
) != 0) {
1413 skip_bits(&s
->gb
, 8);
1417 clear_blocks(s
->block
[0]);
1419 ret
= mpeg_decode_mb(s
, s
->block
);
1420 dprintf("ret=%d\n", ret
);
1425 MPV_decode_mb(s
, s
->block
);
1429 /* end of slice reached */
1430 if (s
->mb_x
== (s
->mb_width
- 1) &&
1431 s
->mb_y
== (s
->mb_height
- 1)) {
1437 /* XXX: incorrect reported qscale for mpeg2 */
1438 if (s
->pict_type
== B_TYPE
) {
1439 picture
= s
->current_picture
;
1440 avctx
->quality
= s
->qscale
;
1442 /* latency of 1 frame for I and P frames */
1443 /* XXX: use another variable than picture_number */
1444 if (s
->picture_number
== 0) {
1447 picture
= s
->last_picture
;
1448 avctx
->quality
= s
->last_qscale
;
1450 s
->last_qscale
= s
->qscale
;
1451 s
->picture_number
++;
1454 pict
->data
[0] = picture
[0];
1455 pict
->data
[1] = picture
[1];
1456 pict
->data
[2] = picture
[2];
1457 pict
->linesize
[0] = s
->linesize
;
1458 pict
->linesize
[1] = s
->linesize
/ 2;
1459 pict
->linesize
[2] = s
->linesize
/ 2;
1469 static int mpeg1_decode_sequence(AVCodecContext
*avctx
,
1470 UINT8
*buf
, int buf_size
)
1472 Mpeg1Context
*s1
= avctx
->priv_data
;
1473 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
1474 int width
, height
, i
, v
, j
;
1476 init_get_bits(&s
->gb
, buf
, buf_size
);
1478 width
= get_bits(&s
->gb
, 12);
1479 height
= get_bits(&s
->gb
, 12);
1480 skip_bits(&s
->gb
, 4);
1481 s
->frame_rate_index
= get_bits(&s
->gb
, 4);
1482 if (s
->frame_rate_index
== 0)
1484 s
->bit_rate
= get_bits(&s
->gb
, 18) * 400;
1485 if (get_bits1(&s
->gb
) == 0) /* marker */
1487 if (width
<= 0 || height
<= 0 ||
1488 (width
% 2) != 0 || (height
% 2) != 0)
1490 if (width
!= s
->width
||
1491 height
!= s
->height
) {
1492 /* start new mpeg1 context decoding */
1493 s
->out_format
= FMT_MPEG1
;
1494 if (s1
->mpeg_enc_ctx_allocated
) {
1499 s
->has_b_frames
= 1;
1501 avctx
->width
= width
;
1502 avctx
->height
= height
;
1503 if (s
->frame_rate_index
>= 9) {
1504 /* at least give a valid frame rate (some old mpeg1 have this) */
1505 avctx
->frame_rate
= 25 * FRAME_RATE_BASE
;
1507 avctx
->frame_rate
= frame_rate_tab
[s
->frame_rate_index
];
1509 s
->frame_rate
= avctx
->frame_rate
;
1510 avctx
->bit_rate
= s
->bit_rate
;
1512 if (MPV_common_init(s
) < 0)
1515 s1
->mpeg_enc_ctx_allocated
= 1;
1518 skip_bits(&s
->gb
, 10); /* vbv_buffer_size */
1519 skip_bits(&s
->gb
, 1);
1522 if (get_bits1(&s
->gb
)) {
1524 v
= get_bits(&s
->gb
, 8);
1525 j
= zigzag_direct
[i
];
1526 s
->intra_matrix
[j
] = v
;
1527 s
->chroma_intra_matrix
[j
] = v
;
1530 dprintf("intra matrix present\n");
1532 dprintf(" %d", s
->intra_matrix
[zigzag_direct
[i
]]);
1537 v
= default_intra_matrix
[i
];
1538 s
->intra_matrix
[i
] = v
;
1539 s
->chroma_intra_matrix
[i
] = v
;
1542 if (get_bits1(&s
->gb
)) {
1544 v
= get_bits(&s
->gb
, 8);
1545 j
= zigzag_direct
[i
];
1546 s
->inter_matrix
[j
] = v
;
1547 s
->chroma_inter_matrix
[j
] = v
;
1550 dprintf("non intra matrix present\n");
1552 dprintf(" %d", s
->inter_matrix
[zigzag_direct
[i
]]);
1557 v
= default_non_intra_matrix
[i
];
1558 s
->inter_matrix
[i
] = v
;
1559 s
->chroma_inter_matrix
[i
] = v
;
1563 /* we set mpeg2 parameters so that it emulates mpeg1 */
1564 s
->progressive_sequence
= 1;
1565 s
->progressive_frame
= 1;
1566 s
->picture_structure
= PICT_FRAME
;
1567 s
->frame_pred_frame_dct
= 1;
1569 avctx
->sub_id
= 1; /* indicates mpeg1 */
1573 /* handle buffering and image synchronisation */
1574 static int mpeg_decode_frame(AVCodecContext
*avctx
,
1575 void *data
, int *data_size
,
1576 UINT8
*buf
, int buf_size
)
1578 Mpeg1Context
*s
= avctx
->priv_data
;
1579 UINT8
*buf_end
, *buf_ptr
, *buf_start
;
1580 int len
, start_code_found
, ret
, code
, start_code
, input_size
;
1581 AVPicture
*picture
= data
;
1582 MpegEncContext
*s2
= &s
->mpeg_enc_ctx
;
1584 dprintf("fill_buffer\n");
1588 /* special case for last picture */
1589 if (buf_size
== 0) {
1590 if (s2
->picture_number
> 0) {
1591 picture
->data
[0] = s2
->next_picture
[0];
1592 picture
->data
[1] = s2
->next_picture
[1];
1593 picture
->data
[2] = s2
->next_picture
[2];
1594 picture
->linesize
[0] = s2
->linesize
;
1595 picture
->linesize
[1] = s2
->linesize
/ 2;
1596 picture
->linesize
[2] = s2
->linesize
/ 2;
1597 *data_size
= sizeof(AVPicture
);
1603 buf_end
= buf
+ buf_size
;
1606 if (s
->repeat_field
% 2 == 1) {
1608 //fprintf(stderr,"\nRepeating last frame: %d -> %d! pict: %d %d", avctx->frame_number-1, avctx->frame_number,
1609 // s2->picture_number, s->repeat_field);
1610 if (avctx
->flags
& CODEC_FLAG_REPEAT_FIELD
) {
1611 *data_size
= sizeof(AVPicture
);
1616 while (buf_ptr
< buf_end
) {
1617 buf_start
= buf_ptr
;
1618 /* find start next code */
1619 code
= find_start_code(&buf_ptr
, buf_end
, &s
->header_state
);
1621 start_code_found
= 1;
1623 start_code_found
= 0;
1625 /* copy to buffer */
1626 len
= buf_ptr
- buf_start
;
1627 if (len
+ (s
->buf_ptr
- s
->buffer
) > s
->buffer_size
) {
1628 /* data too big : flush */
1629 s
->buf_ptr
= s
->buffer
;
1630 if (start_code_found
)
1631 s
->start_code
= code
;
1633 memcpy(s
->buf_ptr
, buf_start
, len
);
1636 if (start_code_found
) {
1637 /* prepare data for next start code */
1638 input_size
= s
->buf_ptr
- s
->buffer
;
1639 start_code
= s
->start_code
;
1640 s
->buf_ptr
= s
->buffer
;
1641 s
->start_code
= code
;
1642 switch(start_code
) {
1643 case SEQ_START_CODE
:
1644 mpeg1_decode_sequence(avctx
, s
->buffer
,
1648 case PICTURE_START_CODE
:
1649 /* we have a complete image : we try to decompress it */
1650 mpeg1_decode_picture(avctx
,
1651 s
->buffer
, input_size
);
1653 case EXT_START_CODE
:
1654 mpeg_decode_extension(avctx
,
1655 s
->buffer
, input_size
);
1658 if (start_code
>= SLICE_MIN_START_CODE
&&
1659 start_code
<= SLICE_MAX_START_CODE
) {
1660 ret
= mpeg_decode_slice(avctx
, picture
,
1661 start_code
, s
->buffer
, input_size
);
1663 /* got a picture: exit */
1664 /* first check if we must repeat the frame */
1665 avctx
->repeat_pict
= 0;
1667 if (s2
->progressive_frame
&& s2
->repeat_first_field
) {
1668 //fprintf(stderr,"\nRepeat this frame: %d! pict: %d",avctx->frame_number,s2->picture_number);
1669 //s2->repeat_first_field = 0;
1670 //s2->progressive_frame = 0;
1671 if (++s
->repeat_field
> 2)
1672 s
->repeat_field
= 0;
1673 avctx
->repeat_pict
= 1;
1676 if (s2
->repeat_first_field
) {
1677 if (s2
->progressive_sequence
) {
1678 if (s2
->top_field_first
)
1679 avctx
->repeat_pict
= 4;
1681 avctx
->repeat_pict
= 2;
1682 } else if (s2
->progressive_frame
) {
1683 avctx
->repeat_pict
= 1;
1686 *data_size
= sizeof(AVPicture
);
1696 return buf_ptr
- buf
;
1699 static int mpeg_decode_end(AVCodecContext
*avctx
)
1701 Mpeg1Context
*s
= avctx
->priv_data
;
1703 if (s
->mpeg_enc_ctx_allocated
)
1704 MPV_common_end(&s
->mpeg_enc_ctx
);
1708 AVCodec mpeg_decoder
= {
1711 CODEC_ID_MPEG1VIDEO
,
1712 sizeof(Mpeg1Context
),