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
)
538 init_vlc(&dc_lum_vlc
, 9, 12,
539 vlc_dc_lum_bits
, 1, 1,
540 vlc_dc_lum_code
, 2, 2);
541 init_vlc(&dc_chroma_vlc
, 9, 12,
542 vlc_dc_chroma_bits
, 1, 1,
543 vlc_dc_chroma_code
, 2, 2);
544 init_vlc(&mv_vlc
, 9, 17,
545 &mbMotionVectorTable
[0][1], 2, 1,
546 &mbMotionVectorTable
[0][0], 2, 1);
547 init_vlc(&mbincr_vlc
, 9, 35,
548 &mbAddrIncrTable
[0][1], 2, 1,
549 &mbAddrIncrTable
[0][0], 2, 1);
550 init_vlc(&mb_pat_vlc
, 9, 63,
551 &mbPatTable
[0][1], 2, 1,
552 &mbPatTable
[0][0], 2, 1);
554 init_vlc(&mb_ptype_vlc
, 6, 32,
555 &table_mb_ptype
[0][1], 2, 1,
556 &table_mb_ptype
[0][0], 2, 1);
557 init_vlc(&mb_btype_vlc
, 6, 32,
558 &table_mb_btype
[0][1], 2, 1,
559 &table_mb_btype
[0][0], 2, 1);
562 /* cannot use generic init because we must add the EOB code */
563 init_vlc(&rl_mpeg1
.vlc
, 9, rl_mpeg1
.n
+ 2,
564 &rl_mpeg1
.table_vlc
[0][1], 4, 2,
565 &rl_mpeg1
.table_vlc
[0][0], 4, 2);
566 init_vlc(&rl_mpeg2
.vlc
, 9, rl_mpeg2
.n
+ 2,
567 &rl_mpeg2
.table_vlc
[0][1], 4, 2,
568 &rl_mpeg2
.table_vlc
[0][0], 4, 2);
572 static inline int get_dmv(MpegEncContext
*s
)
574 if(get_bits1(&s
->gb
))
575 return 1 - (get_bits1(&s
->gb
) << 1);
580 static inline int get_qscale(MpegEncContext
*s
)
584 if (s
->q_scale_type
) {
585 qscale
= non_linear_qscale
[get_bits(&s
->gb
, 5)];
587 qscale
= get_bits(&s
->gb
, 5) << 1;
590 /* for mpeg1, we use the generic unquant code */
591 qscale
= get_bits(&s
->gb
, 5);
596 /* motion type (for mpeg2) */
602 static int mpeg_decode_mb(MpegEncContext
*s
,
603 DCTELEM block
[6][64])
605 int i
, j
, k
, cbp
, val
, code
, mb_type
, motion_type
;
607 /* skip mb handling */
608 if (s
->mb_incr
== 0) {
609 /* read again increment */
612 code
= get_vlc(&s
->gb
, &mbincr_vlc
);
614 return 1; /* error = end of slice */
619 /* otherwise, stuffing, nothing to do */
626 if (++s
->mb_x
>= s
->mb_width
) {
628 if (s
->mb_y
>= (s
->mb_height
- 1))
632 dprintf("decode_mb: x=%d y=%d\n", s
->mb_x
, s
->mb_y
);
634 if (--s
->mb_incr
!= 0) {
638 s
->block_last_index
[i
] = -1;
639 s
->mv_type
= MV_TYPE_16X16
;
640 if (s
->pict_type
== P_TYPE
) {
641 /* if P type, zero motion vector is implied */
642 s
->mv_dir
= MV_DIR_FORWARD
;
643 s
->mv
[0][0][0] = s
->mv
[0][0][1] = 0;
644 s
->last_mv
[0][0][0] = s
->last_mv
[0][0][1] = 0;
645 s
->last_mv
[0][1][0] = s
->last_mv
[0][1][1] = 0;
647 /* if B type, reuse previous vectors and directions */
648 s
->mv
[0][0][0] = s
->last_mv
[0][0][0];
649 s
->mv
[0][0][1] = s
->last_mv
[0][0][1];
650 s
->mv
[1][0][0] = s
->last_mv
[1][0][0];
651 s
->mv
[1][0][1] = s
->last_mv
[1][0][1];
657 switch(s
->pict_type
) {
660 if (get_bits1(&s
->gb
) == 0) {
661 if (get_bits1(&s
->gb
) == 0)
663 mb_type
= MB_QUANT
| MB_INTRA
;
669 mb_type
= get_vlc(&s
->gb
, &mb_ptype_vlc
);
674 mb_type
= get_vlc(&s
->gb
, &mb_btype_vlc
);
679 dprintf("mb_type=%x\n", mb_type
);
680 motion_type
= 0; /* avoid warning */
681 if (mb_type
& (MB_FOR
|MB_BACK
)) {
682 /* get additionnal motion vector type */
683 if (s
->picture_structure
== PICT_FRAME
&& s
->frame_pred_frame_dct
)
684 motion_type
= MT_FRAME
;
686 motion_type
= get_bits(&s
->gb
, 2);
688 /* compute dct type */
689 if (s
->picture_structure
== PICT_FRAME
&&
690 !s
->frame_pred_frame_dct
&&
691 (mb_type
& (MB_PAT
| MB_INTRA
))) {
692 s
->interlaced_dct
= get_bits1(&s
->gb
);
694 if (s
->interlaced_dct
)
695 printf("interlaced_dct\n");
698 s
->interlaced_dct
= 0; /* frame based */
701 if (mb_type
& MB_QUANT
) {
702 s
->qscale
= get_qscale(s
);
704 if (mb_type
& MB_INTRA
) {
705 if (s
->concealment_motion_vectors
) {
706 /* just parse them */
707 if (s
->picture_structure
!= PICT_FRAME
)
708 skip_bits1(&s
->gb
); /* field select */
709 mpeg_decode_motion(s
, s
->mpeg_f_code
[0][0], 0);
710 mpeg_decode_motion(s
, s
->mpeg_f_code
[0][1], 0);
714 memset(s
->last_mv
, 0, sizeof(s
->last_mv
)); /* reset mv prediction */
719 /* special case of implicit zero motion vector */
720 if (s
->pict_type
== P_TYPE
&& !(mb_type
& MB_FOR
)) {
721 s
->mv_dir
= MV_DIR_FORWARD
;
722 s
->mv_type
= MV_TYPE_16X16
;
723 s
->last_mv
[0][0][0] = 0;
724 s
->last_mv
[0][0][1] = 0;
725 s
->last_mv
[0][1][0] = 0;
726 s
->last_mv
[0][1][1] = 0;
729 } else if (mb_type
& (MB_FOR
| MB_BACK
)) {
733 if (mb_type
& (MB_FOR
>> i
)) {
734 s
->mv_dir
|= (MV_DIR_FORWARD
>> i
);
735 dprintf("motion_type=%d\n", motion_type
);
736 switch(motion_type
) {
737 case MT_FRAME
: /* or MT_16X8 */
738 if (s
->picture_structure
== PICT_FRAME
) {
740 s
->mv_type
= MV_TYPE_16X16
;
742 val
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][k
],
743 s
->last_mv
[i
][0][k
]);
744 s
->last_mv
[i
][0][k
] = val
;
745 s
->last_mv
[i
][1][k
] = val
;
746 /* full_pel: only for mpeg1 */
749 s
->mv
[i
][0][k
] = val
;
750 dprintf("mv%d: %d\n", k
, val
);
754 s
->mv_type
= MV_TYPE_16X8
;
756 s
->field_select
[i
][j
] = get_bits1(&s
->gb
);
758 val
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][k
],
759 s
->last_mv
[i
][j
][k
]);
760 s
->last_mv
[i
][j
][k
] = val
;
761 s
->mv
[i
][j
][k
] = val
;
767 if (s
->picture_structure
== PICT_FRAME
) {
768 s
->mv_type
= MV_TYPE_FIELD
;
770 s
->field_select
[i
][j
] = get_bits1(&s
->gb
);
771 val
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][0],
772 s
->last_mv
[i
][j
][0]);
773 s
->last_mv
[i
][j
][0] = val
;
774 s
->mv
[i
][j
][0] = val
;
775 dprintf("fmx=%d\n", val
);
776 val
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][1],
777 s
->last_mv
[i
][j
][1] >> 1);
778 s
->last_mv
[i
][j
][1] = val
<< 1;
779 s
->mv
[i
][j
][1] = val
;
780 dprintf("fmy=%d\n", val
);
783 s
->mv_type
= MV_TYPE_16X16
;
784 s
->field_select
[i
][0] = get_bits1(&s
->gb
);
786 val
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][k
],
787 s
->last_mv
[i
][0][k
]);
788 s
->last_mv
[i
][0][k
] = val
;
789 s
->last_mv
[i
][1][k
] = val
;
790 s
->mv
[i
][0][k
] = val
;
796 int dmx
, dmy
, mx
, my
, m
;
798 mx
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][0],
799 s
->last_mv
[i
][0][0]);
800 s
->last_mv
[i
][0][0] = mx
;
801 s
->last_mv
[i
][1][0] = mx
;
803 my
= mpeg_decode_motion(s
, s
->mpeg_f_code
[i
][1],
804 s
->last_mv
[i
][0][1] >> 1);
806 s
->mv_type
= MV_TYPE_DMV
;
807 /* XXX: totally broken */
808 if (s
->picture_structure
== PICT_FRAME
) {
809 s
->last_mv
[i
][0][1] = my
<< 1;
810 s
->last_mv
[i
][1][1] = my
<< 1;
812 m
= s
->top_field_first ?
1 : 3;
813 /* top -> top pred */
815 s
->mv
[i
][0][1] = my
<< 1;
816 s
->mv
[i
][1][0] = ((mx
* m
+ (mx
> 0)) >> 1) + dmx
;
817 s
->mv
[i
][1][1] = ((my
* m
+ (my
> 0)) >> 1) + dmy
- 1;
820 s
->mv
[i
][2][1] = my
<< 1;
821 s
->mv
[i
][3][0] = ((mx
* m
+ (mx
> 0)) >> 1) + dmx
;
822 s
->mv
[i
][3][1] = ((my
* m
+ (my
> 0)) >> 1) + dmy
+ 1;
824 s
->last_mv
[i
][0][1] = my
;
825 s
->last_mv
[i
][1][1] = my
;
828 s
->mv
[i
][1][0] = ((mx
+ (mx
> 0)) >> 1) + dmx
;
829 s
->mv
[i
][1][1] = ((my
+ (my
> 0)) >> 1) + dmy
- 1
830 /* + 2 * cur_field */;
839 if ((mb_type
& MB_INTRA
) && s
->concealment_motion_vectors
) {
840 skip_bits1(&s
->gb
); /* marker */
843 if (mb_type
& MB_PAT
) {
844 cbp
= get_vlc(&s
->gb
, &mb_pat_vlc
);
849 dprintf("cbp=%x\n", cbp
);
854 if (cbp
& (1 << (5 - i
))) {
855 if (mpeg2_decode_block_intra(s
, block
[i
], i
) < 0)
858 s
->block_last_index
[i
] = -1;
863 if (cbp
& (1 << (5 - i
))) {
864 if (mpeg2_decode_block_non_intra(s
, block
[i
], i
) < 0)
867 s
->block_last_index
[i
] = -1;
873 if (cbp
& (1 << (5 - i
))) {
874 if (mpeg1_decode_block(s
, block
[i
], i
) < 0)
877 s
->block_last_index
[i
] = -1;
884 /* as h263, but only 17 codes */
885 static int mpeg_decode_motion(MpegEncContext
*s
, int fcode
, int pred
)
887 int code
, sign
, val
, m
, l
, shift
;
889 code
= get_vlc(&s
->gb
, &mv_vlc
);
896 sign
= get_bits1(&s
->gb
);
898 val
= (code
- 1) << shift
;
900 val
|= get_bits(&s
->gb
, shift
);
906 /* modulo decoding */
907 l
= (1 << shift
) * 16;
911 } else if (val
>= l
) {
917 static inline int decode_dc(MpegEncContext
*s
, int component
)
921 if (component
== 0) {
922 code
= get_vlc(&s
->gb
, &dc_lum_vlc
);
924 code
= get_vlc(&s
->gb
, &dc_chroma_vlc
);
931 diff
= get_bits(&s
->gb
, code
);
932 if ((diff
& (1 << (code
- 1))) == 0)
933 diff
= (-1 << code
) | (diff
+ 1);
938 static int mpeg1_decode_block(MpegEncContext
*s
,
942 int level
, dc
, diff
, i
, j
, run
;
944 RLTable
*rl
= &rl_mpeg1
;
948 component
= (n
<= 3 ?
0 : n
- 4 + 1);
949 diff
= decode_dc(s
, component
);
952 dc
= s
->last_dc
[component
];
954 s
->last_dc
[component
] = dc
;
956 dprintf("dc=%d diff=%d\n", dc
, diff
);
963 /* special case for the first coef. no need to add a second vlc table */
965 SHOW_BITS(&s
->gb
, v
, 2);
968 level
= 1 - ((v
& 1) << 1);
970 RESTORE_BITS(&s
->gb
);
973 RESTORE_BITS(&s
->gb
);
976 /* now quantify & encode AC coefs */
978 code
= get_vlc(&s
->gb
, &rl
->vlc
);
984 } else if (code
== 111) {
986 run
= get_bits(&s
->gb
, 6);
987 level
= get_bits(&s
->gb
, 8);
988 level
= (level
<< 24) >> 24;
990 level
= get_bits(&s
->gb
, 8) - 256;
991 } else if (level
== 0) {
992 level
= get_bits(&s
->gb
, 8);
995 run
= rl
->table_run
[code
];
996 level
= rl
->table_level
[code
];
997 if (get_bits1(&s
->gb
))
1004 dprintf("%d: run=%d level=%d\n", n
, run
, level
);
1005 j
= zigzag_direct
[i
];
1009 s
->block_last_index
[n
] = i
-1;
1013 /* Also does unquantization here, since I will never support mpeg2
1015 static int mpeg2_decode_block_non_intra(MpegEncContext
*s
,
1019 int level
, i
, j
, run
;
1021 RLTable
*rl
= &rl_mpeg1
;
1022 const UINT8
*scan_table
;
1023 const UINT16
*matrix
;
1026 if (s
->alternate_scan
)
1027 scan_table
= ff_alternate_vertical_scan
;
1029 scan_table
= zigzag_direct
;
1038 matrix
= s
->inter_matrix
;
1040 matrix
= s
->chroma_inter_matrix
;
1042 /* special case for the first coef. no need to add a second vlc table */
1044 SHOW_BITS(&s
->gb
, v
, 2);
1047 level
= 1 - ((v
& 1) << 1);
1049 RESTORE_BITS(&s
->gb
);
1052 RESTORE_BITS(&s
->gb
);
1055 /* now quantify & encode AC coefs */
1057 code
= get_vlc(&s
->gb
, &rl
->vlc
);
1062 } else if (code
== 111) {
1064 run
= get_bits(&s
->gb
, 6);
1065 level
= get_bits(&s
->gb
, 12);
1066 level
= (level
<< 20) >> 20;
1068 run
= rl
->table_run
[code
];
1069 level
= rl
->table_level
[code
];
1070 if (get_bits1(&s
->gb
))
1078 dprintf("%d: run=%d level=%d\n", n
, run
, level
);
1081 level
= ((level
* 2 + 1) * s
->qscale
* matrix
[j
]) >> 5;
1083 level
= ((-level
* 2 + 1) * s
->qscale
* matrix
[j
]) >> 5;
1086 /* XXX: is it really necessary to saturate since the encoder
1087 knows whats going on ? */
1092 block
[63] ^= (mismatch
& 1);
1093 s
->block_last_index
[n
] = i
;
1097 static int mpeg2_decode_block_intra(MpegEncContext
*s
,
1101 int level
, dc
, diff
, i
, j
, run
;
1102 int code
, component
;
1104 const UINT8
*scan_table
;
1105 const UINT16
*matrix
;
1108 if (s
->alternate_scan
)
1109 scan_table
= ff_alternate_vertical_scan
;
1111 scan_table
= zigzag_direct
;
1114 component
= (n
<= 3 ?
0 : n
- 4 + 1);
1115 diff
= decode_dc(s
, component
);
1118 dc
= s
->last_dc
[component
];
1120 s
->last_dc
[component
] = dc
;
1121 block
[0] = dc
<< (3 - s
->intra_dc_precision
);
1122 dprintf("dc=%d\n", block
[0]);
1123 mismatch
= block
[0] ^ 1;
1125 if (s
->intra_vlc_format
)
1130 matrix
= s
->intra_matrix
;
1132 matrix
= s
->chroma_intra_matrix
;
1134 /* now quantify & encode AC coefs */
1136 code
= get_vlc(&s
->gb
, &rl
->vlc
);
1141 } else if (code
== 111) {
1143 run
= get_bits(&s
->gb
, 6);
1144 level
= get_bits(&s
->gb
, 12);
1145 level
= (level
<< 20) >> 20;
1147 run
= rl
->table_run
[code
];
1148 level
= rl
->table_level
[code
];
1149 if (get_bits1(&s
->gb
))
1156 dprintf("%d: run=%d level=%d\n", n
, run
, level
);
1157 level
= (level
* s
->qscale
* matrix
[j
]) / 16;
1158 /* XXX: is it really necessary to saturate since the encoder
1159 knows whats going on ? */
1164 block
[63] ^= (mismatch
& 1);
1165 s
->block_last_index
[n
] = i
;
1169 /* compressed picture size */
1170 #define PICTURE_BUFFER_SIZE 100000
1172 typedef struct Mpeg1Context
{
1173 MpegEncContext mpeg_enc_ctx
;
1174 UINT32 header_state
;
1175 int start_code
; /* current start code */
1176 UINT8 buffer
[PICTURE_BUFFER_SIZE
];
1179 int mpeg_enc_ctx_allocated
; /* true if decoding context allocated */
1180 int repeat_field
; /* true if we must repeat the field */
1183 static int mpeg_decode_init(AVCodecContext
*avctx
)
1185 Mpeg1Context
*s
= avctx
->priv_data
;
1187 s
->header_state
= 0xff;
1188 s
->mpeg_enc_ctx_allocated
= 0;
1189 s
->buffer_size
= PICTURE_BUFFER_SIZE
;
1191 s
->buf_ptr
= s
->buffer
;
1192 s
->mpeg_enc_ctx
.picture_number
= 0;
1193 s
->repeat_field
= 0;
1194 s
->mpeg_enc_ctx
.codec_id
= avctx
->codec
->id
;
1195 avctx
->mbskip_table
= s
->mpeg_enc_ctx
.mbskip_table
;
1196 s
->mpeg_enc_ctx
.flags
= avctx
->flags
;
1200 /* return the 8 bit start code value and update the search
1201 state. Return -1 if no start code found */
1202 static int find_start_code(UINT8
**pbuf_ptr
, UINT8
*buf_end
,
1203 UINT32
*header_state
)
1206 unsigned int state
, v
;
1209 state
= *header_state
;
1210 buf_ptr
= *pbuf_ptr
;
1211 while (buf_ptr
< buf_end
) {
1213 if (state
== 0x000001) {
1214 state
= ((state
<< 8) | v
) & 0xffffff;
1218 state
= ((state
<< 8) | v
) & 0xffffff;
1222 *pbuf_ptr
= buf_ptr
;
1223 *header_state
= state
;
1227 static int mpeg1_decode_picture(AVCodecContext
*avctx
,
1228 UINT8
*buf
, int buf_size
)
1230 Mpeg1Context
*s1
= avctx
->priv_data
;
1231 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
1234 init_get_bits(&s
->gb
, buf
, buf_size
);
1236 ref
= get_bits(&s
->gb
, 10); /* temporal ref */
1237 s
->pict_type
= get_bits(&s
->gb
, 3);
1238 dprintf("pict_type=%d number=%d\n", s
->pict_type
, s
->picture_number
);
1239 skip_bits(&s
->gb
, 16);
1240 if (s
->pict_type
== P_TYPE
|| s
->pict_type
== B_TYPE
) {
1241 s
->full_pel
[0] = get_bits1(&s
->gb
);
1242 f_code
= get_bits(&s
->gb
, 3);
1245 s
->mpeg_f_code
[0][0] = f_code
;
1246 s
->mpeg_f_code
[0][1] = f_code
;
1248 if (s
->pict_type
== B_TYPE
) {
1249 s
->full_pel
[1] = get_bits1(&s
->gb
);
1250 f_code
= get_bits(&s
->gb
, 3);
1253 s
->mpeg_f_code
[1][0] = f_code
;
1254 s
->mpeg_f_code
[1][1] = f_code
;
1262 static void mpeg_decode_sequence_extension(MpegEncContext
*s
)
1264 int horiz_size_ext
, vert_size_ext
;
1265 int bit_rate_ext
, vbv_buf_ext
, low_delay
;
1266 int frame_rate_ext_n
, frame_rate_ext_d
;
1268 skip_bits(&s
->gb
, 8); /* profil and level */
1269 s
->progressive_sequence
= get_bits1(&s
->gb
); /* progressive_sequence */
1270 skip_bits(&s
->gb
, 2); /* chroma_format */
1271 horiz_size_ext
= get_bits(&s
->gb
, 2);
1272 vert_size_ext
= get_bits(&s
->gb
, 2);
1273 s
->width
|= (horiz_size_ext
<< 12);
1274 s
->height
|= (vert_size_ext
<< 12);
1275 bit_rate_ext
= get_bits(&s
->gb
, 12); /* XXX: handle it */
1276 s
->bit_rate
= ((s
->bit_rate
/ 400) | (bit_rate_ext
<< 12)) * 400;
1277 skip_bits1(&s
->gb
); /* marker */
1278 vbv_buf_ext
= get_bits(&s
->gb
, 8);
1279 low_delay
= get_bits1(&s
->gb
);
1280 frame_rate_ext_n
= get_bits(&s
->gb
, 2);
1281 frame_rate_ext_d
= get_bits(&s
->gb
, 5);
1282 if (frame_rate_ext_d
>= 1)
1283 s
->frame_rate
= (s
->frame_rate
* frame_rate_ext_n
) / frame_rate_ext_d
;
1284 dprintf("sequence extension\n");
1286 s
->avctx
->sub_id
= 2; /* indicates mpeg2 found */
1289 static void mpeg_decode_quant_matrix_extension(MpegEncContext
*s
)
1293 dprintf("matrix extension\n");
1295 if (get_bits1(&s
->gb
)) {
1297 v
= get_bits(&s
->gb
, 8);
1298 j
= zigzag_direct
[i
];
1299 s
->intra_matrix
[j
] = v
;
1300 s
->chroma_intra_matrix
[j
] = v
;
1303 if (get_bits1(&s
->gb
)) {
1305 v
= get_bits(&s
->gb
, 8);
1306 j
= zigzag_direct
[i
];
1307 s
->inter_matrix
[j
] = v
;
1308 s
->chroma_inter_matrix
[j
] = v
;
1311 if (get_bits1(&s
->gb
)) {
1313 v
= get_bits(&s
->gb
, 8);
1314 j
= zigzag_direct
[i
];
1315 s
->chroma_intra_matrix
[j
] = v
;
1318 if (get_bits1(&s
->gb
)) {
1320 v
= get_bits(&s
->gb
, 8);
1321 j
= zigzag_direct
[i
];
1322 s
->chroma_inter_matrix
[j
] = v
;
1327 static void mpeg_decode_picture_coding_extension(MpegEncContext
*s
)
1329 s
->full_pel
[0] = s
->full_pel
[1] = 0;
1330 s
->mpeg_f_code
[0][0] = get_bits(&s
->gb
, 4);
1331 s
->mpeg_f_code
[0][1] = get_bits(&s
->gb
, 4);
1332 s
->mpeg_f_code
[1][0] = get_bits(&s
->gb
, 4);
1333 s
->mpeg_f_code
[1][1] = get_bits(&s
->gb
, 4);
1334 s
->intra_dc_precision
= get_bits(&s
->gb
, 2);
1335 s
->picture_structure
= get_bits(&s
->gb
, 2);
1336 s
->top_field_first
= get_bits1(&s
->gb
);
1337 s
->frame_pred_frame_dct
= get_bits1(&s
->gb
);
1338 s
->concealment_motion_vectors
= get_bits1(&s
->gb
);
1339 s
->q_scale_type
= get_bits1(&s
->gb
);
1340 s
->intra_vlc_format
= get_bits1(&s
->gb
);
1341 s
->alternate_scan
= get_bits1(&s
->gb
);
1342 s
->repeat_first_field
= get_bits1(&s
->gb
);
1343 s
->chroma_420_type
= get_bits1(&s
->gb
);
1344 s
->progressive_frame
= get_bits1(&s
->gb
);
1345 /* composite display not parsed */
1346 dprintf("intra_dc_precision=%d\n", s
->intra_dc_precision
);
1347 dprintf("picture_structure=%d\n", s
->picture_structure
);
1348 dprintf("top field first=%d\n", s
->top_field_first
);
1349 dprintf("repeat first field=%d\n", s
->repeat_first_field
);
1350 dprintf("conceal=%d\n", s
->concealment_motion_vectors
);
1351 dprintf("intra_vlc_format=%d\n", s
->intra_vlc_format
);
1352 dprintf("alternate_scan=%d\n", s
->alternate_scan
);
1353 dprintf("frame_pred_frame_dct=%d\n", s
->frame_pred_frame_dct
);
1354 dprintf("progressive_frame=%d\n", s
->progressive_frame
);
1357 static void mpeg_decode_extension(AVCodecContext
*avctx
,
1358 UINT8
*buf
, int buf_size
)
1360 Mpeg1Context
*s1
= avctx
->priv_data
;
1361 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
1364 init_get_bits(&s
->gb
, buf
, buf_size
);
1366 ext_type
= get_bits(&s
->gb
, 4);
1370 mpeg_decode_sequence_extension(s
);
1373 /* quant matrix extension */
1374 mpeg_decode_quant_matrix_extension(s
);
1377 /* picture extension */
1378 mpeg_decode_picture_coding_extension(s
);
1383 /* return 1 if end of frame */
1384 static int mpeg_decode_slice(AVCodecContext
*avctx
,
1387 UINT8
*buf
, int buf_size
)
1389 Mpeg1Context
*s1
= avctx
->priv_data
;
1390 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
1393 start_code
= (start_code
- 1) & 0xff;
1394 if (start_code
>= s
->mb_height
)
1396 s
->last_dc
[0] = 1 << (7 + s
->intra_dc_precision
);
1397 s
->last_dc
[1] = s
->last_dc
[0];
1398 s
->last_dc
[2] = s
->last_dc
[0];
1399 memset(s
->last_mv
, 0, sizeof(s
->last_mv
));
1401 s
->mb_y
= start_code
;
1403 /* start frame decoding */
1404 if (s
->first_slice
) {
1409 init_get_bits(&s
->gb
, buf
, buf_size
);
1411 s
->qscale
= get_qscale(s
);
1412 /* extra slice info */
1413 while (get_bits1(&s
->gb
) != 0) {
1414 skip_bits(&s
->gb
, 8);
1418 clear_blocks(s
->block
[0]);
1420 ret
= mpeg_decode_mb(s
, s
->block
);
1421 dprintf("ret=%d\n", ret
);
1426 MPV_decode_mb(s
, s
->block
);
1430 /* end of slice reached */
1431 if (s
->mb_x
== (s
->mb_width
- 1) &&
1432 s
->mb_y
== (s
->mb_height
- 1)) {
1438 /* XXX: incorrect reported qscale for mpeg2 */
1439 if (s
->pict_type
== B_TYPE
) {
1440 picture
= s
->current_picture
;
1441 avctx
->quality
= s
->qscale
;
1443 /* latency of 1 frame for I and P frames */
1444 /* XXX: use another variable than picture_number */
1445 if (s
->picture_number
== 0) {
1448 picture
= s
->last_picture
;
1449 avctx
->quality
= s
->last_qscale
;
1451 s
->last_qscale
= s
->qscale
;
1452 s
->picture_number
++;
1455 pict
->data
[0] = picture
[0];
1456 pict
->data
[1] = picture
[1];
1457 pict
->data
[2] = picture
[2];
1458 pict
->linesize
[0] = s
->linesize
;
1459 pict
->linesize
[1] = s
->linesize
/ 2;
1460 pict
->linesize
[2] = s
->linesize
/ 2;
1470 static int mpeg1_decode_sequence(AVCodecContext
*avctx
,
1471 UINT8
*buf
, int buf_size
)
1473 Mpeg1Context
*s1
= avctx
->priv_data
;
1474 MpegEncContext
*s
= &s1
->mpeg_enc_ctx
;
1475 int width
, height
, i
, v
, j
;
1477 init_get_bits(&s
->gb
, buf
, buf_size
);
1479 width
= get_bits(&s
->gb
, 12);
1480 height
= get_bits(&s
->gb
, 12);
1481 skip_bits(&s
->gb
, 4);
1482 s
->frame_rate_index
= get_bits(&s
->gb
, 4);
1483 if (s
->frame_rate_index
== 0)
1485 s
->bit_rate
= get_bits(&s
->gb
, 18) * 400;
1486 if (get_bits1(&s
->gb
) == 0) /* marker */
1488 if (width
<= 0 || height
<= 0 ||
1489 (width
% 2) != 0 || (height
% 2) != 0)
1491 if (width
!= s
->width
||
1492 height
!= s
->height
) {
1493 /* start new mpeg1 context decoding */
1494 s
->out_format
= FMT_MPEG1
;
1495 if (s1
->mpeg_enc_ctx_allocated
) {
1500 s
->has_b_frames
= 1;
1502 avctx
->width
= width
;
1503 avctx
->height
= height
;
1504 if (s
->frame_rate_index
>= 9) {
1505 /* at least give a valid frame rate (some old mpeg1 have this) */
1506 avctx
->frame_rate
= 25 * FRAME_RATE_BASE
;
1508 avctx
->frame_rate
= frame_rate_tab
[s
->frame_rate_index
];
1510 s
->frame_rate
= avctx
->frame_rate
;
1511 avctx
->bit_rate
= s
->bit_rate
;
1513 if (MPV_common_init(s
) < 0)
1516 s1
->mpeg_enc_ctx_allocated
= 1;
1519 skip_bits(&s
->gb
, 10); /* vbv_buffer_size */
1520 skip_bits(&s
->gb
, 1);
1523 if (get_bits1(&s
->gb
)) {
1525 v
= get_bits(&s
->gb
, 8);
1526 j
= zigzag_direct
[i
];
1527 s
->intra_matrix
[j
] = v
;
1528 s
->chroma_intra_matrix
[j
] = v
;
1531 dprintf("intra matrix present\n");
1533 dprintf(" %d", s
->intra_matrix
[zigzag_direct
[i
]]);
1538 v
= default_intra_matrix
[i
];
1539 s
->intra_matrix
[i
] = v
;
1540 s
->chroma_intra_matrix
[i
] = v
;
1543 if (get_bits1(&s
->gb
)) {
1545 v
= get_bits(&s
->gb
, 8);
1546 j
= zigzag_direct
[i
];
1547 s
->inter_matrix
[j
] = v
;
1548 s
->chroma_inter_matrix
[j
] = v
;
1551 dprintf("non intra matrix present\n");
1553 dprintf(" %d", s
->inter_matrix
[zigzag_direct
[i
]]);
1558 v
= default_non_intra_matrix
[i
];
1559 s
->inter_matrix
[i
] = v
;
1560 s
->chroma_inter_matrix
[i
] = v
;
1564 /* we set mpeg2 parameters so that it emulates mpeg1 */
1565 s
->progressive_sequence
= 1;
1566 s
->progressive_frame
= 1;
1567 s
->picture_structure
= PICT_FRAME
;
1568 s
->frame_pred_frame_dct
= 1;
1570 avctx
->sub_id
= 1; /* indicates mpeg1 */
1574 /* handle buffering and image synchronisation */
1575 static int mpeg_decode_frame(AVCodecContext
*avctx
,
1576 void *data
, int *data_size
,
1577 UINT8
*buf
, int buf_size
)
1579 Mpeg1Context
*s
= avctx
->priv_data
;
1580 UINT8
*buf_end
, *buf_ptr
, *buf_start
;
1581 int len
, start_code_found
, ret
, code
, start_code
, input_size
;
1582 AVPicture
*picture
= data
;
1583 MpegEncContext
*s2
= &s
->mpeg_enc_ctx
;
1585 dprintf("fill_buffer\n");
1589 /* special case for last picture */
1590 if (buf_size
== 0) {
1591 if (s2
->picture_number
> 0) {
1592 picture
->data
[0] = s2
->next_picture
[0];
1593 picture
->data
[1] = s2
->next_picture
[1];
1594 picture
->data
[2] = s2
->next_picture
[2];
1595 picture
->linesize
[0] = s2
->linesize
;
1596 picture
->linesize
[1] = s2
->linesize
/ 2;
1597 picture
->linesize
[2] = s2
->linesize
/ 2;
1598 *data_size
= sizeof(AVPicture
);
1604 buf_end
= buf
+ buf_size
;
1607 if (s
->repeat_field
% 2 == 1) {
1609 //fprintf(stderr,"\nRepeating last frame: %d -> %d! pict: %d %d", avctx->frame_number-1, avctx->frame_number,
1610 // s2->picture_number, s->repeat_field);
1611 if (avctx
->flags
& CODEC_FLAG_REPEAT_FIELD
) {
1612 *data_size
= sizeof(AVPicture
);
1617 while (buf_ptr
< buf_end
) {
1618 buf_start
= buf_ptr
;
1619 /* find start next code */
1620 code
= find_start_code(&buf_ptr
, buf_end
, &s
->header_state
);
1622 start_code_found
= 1;
1624 start_code_found
= 0;
1626 /* copy to buffer */
1627 len
= buf_ptr
- buf_start
;
1628 if (len
+ (s
->buf_ptr
- s
->buffer
) > s
->buffer_size
) {
1629 /* data too big : flush */
1630 s
->buf_ptr
= s
->buffer
;
1631 if (start_code_found
)
1632 s
->start_code
= code
;
1634 memcpy(s
->buf_ptr
, buf_start
, len
);
1637 if (start_code_found
) {
1638 /* prepare data for next start code */
1639 input_size
= s
->buf_ptr
- s
->buffer
;
1640 start_code
= s
->start_code
;
1641 s
->buf_ptr
= s
->buffer
;
1642 s
->start_code
= code
;
1643 switch(start_code
) {
1644 case SEQ_START_CODE
:
1645 mpeg1_decode_sequence(avctx
, s
->buffer
,
1649 case PICTURE_START_CODE
:
1650 /* we have a complete image : we try to decompress it */
1651 mpeg1_decode_picture(avctx
,
1652 s
->buffer
, input_size
);
1654 case EXT_START_CODE
:
1655 mpeg_decode_extension(avctx
,
1656 s
->buffer
, input_size
);
1659 if (start_code
>= SLICE_MIN_START_CODE
&&
1660 start_code
<= SLICE_MAX_START_CODE
) {
1661 ret
= mpeg_decode_slice(avctx
, picture
,
1662 start_code
, s
->buffer
, input_size
);
1664 /* got a picture: exit */
1665 /* first check if we must repeat the frame */
1666 avctx
->repeat_pict
= 0;
1668 if (s2
->progressive_frame
&& s2
->repeat_first_field
) {
1669 //fprintf(stderr,"\nRepeat this frame: %d! pict: %d",avctx->frame_number,s2->picture_number);
1670 //s2->repeat_first_field = 0;
1671 //s2->progressive_frame = 0;
1672 if (++s
->repeat_field
> 2)
1673 s
->repeat_field
= 0;
1674 avctx
->repeat_pict
= 1;
1677 if (s2
->repeat_first_field
) {
1678 if (s2
->progressive_sequence
) {
1679 if (s2
->top_field_first
)
1680 avctx
->repeat_pict
= 4;
1682 avctx
->repeat_pict
= 2;
1683 } else if (s2
->progressive_frame
) {
1684 avctx
->repeat_pict
= 1;
1687 *data_size
= sizeof(AVPicture
);
1697 return buf_ptr
- buf
;
1700 static int mpeg_decode_end(AVCodecContext
*avctx
)
1702 Mpeg1Context
*s
= avctx
->priv_data
;
1704 if (s
->mpeg_enc_ctx_allocated
)
1705 MPV_common_end(&s
->mpeg_enc_ctx
);
1709 AVCodec mpeg_decoder
= {
1712 CODEC_ID_MPEG1VIDEO
,
1713 sizeof(Mpeg1Context
),