2 * MPEG1 / MPEG2 video parser
3 * Copyright (c) 2000,2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 struct MpvParseContext
{
29 AVRational frame_rate
;
30 int progressive_sequence
;
35 static void mpegvideo_extract_headers(AVCodecParserContext
*s
,
36 AVCodecContext
*avctx
,
37 const uint8_t *buf
, int buf_size
)
39 struct MpvParseContext
*pc
= s
->priv_data
;
40 const uint8_t *buf_end
= buf
+ buf_size
;
42 int frame_rate_index
, ext_type
, bytes_left
;
43 int frame_rate_ext_n
, frame_rate_ext_d
;
44 int top_field_first
, repeat_first_field
, progressive_frame
;
45 int horiz_size_ext
, vert_size_ext
, bit_rate_ext
;
49 //FIXME replace the crap with get_bits()
52 while (buf
< buf_end
) {
54 buf
= avpriv_find_start_code(buf
, buf_end
, &start_code
);
55 bytes_left
= buf_end
- buf
;
57 case PICTURE_START_CODE
:
58 if (bytes_left
>= 2) {
59 s
->pict_type
= (buf
[1] >> 3) & 7;
61 vbv_delay
= ((buf
[1] & 0x07) << 13) | (buf
[2] << 5) | (buf
[3] >> 3);
65 if (bytes_left
>= 7) {
66 pc
->width
= (buf
[0] << 4) | (buf
[1] >> 4);
67 pc
->height
= ((buf
[1] & 0x0f) << 8) | buf
[2];
68 if(!avctx
->width
|| !avctx
->height
|| !avctx
->coded_width
|| !avctx
->coded_height
){
69 ff_set_dimensions(avctx
, pc
->width
, pc
->height
);
72 frame_rate_index
= buf
[3] & 0xf;
73 pc
->frame_rate
.den
= avctx
->time_base
.den
= ff_mpeg12_frame_rate_tab
[frame_rate_index
].num
;
74 pc
->frame_rate
.num
= avctx
->time_base
.num
= ff_mpeg12_frame_rate_tab
[frame_rate_index
].den
;
75 bit_rate
= (buf
[4]<<10) | (buf
[5]<<2) | (buf
[6]>>6);
76 avctx
->codec_id
= AV_CODEC_ID_MPEG1VIDEO
;
80 if (bytes_left
>= 1) {
81 ext_type
= (buf
[0] >> 4);
83 case 0x1: /* sequence extension */
84 if (bytes_left
>= 6) {
85 horiz_size_ext
= ((buf
[1] & 1) << 1) | (buf
[2] >> 7);
86 vert_size_ext
= (buf
[2] >> 5) & 3;
87 bit_rate_ext
= ((buf
[2] & 0x1F)<<7) | (buf
[3]>>1);
88 frame_rate_ext_n
= (buf
[5] >> 5) & 3;
89 frame_rate_ext_d
= (buf
[5] & 0x1f);
90 pc
->progressive_sequence
= buf
[1] & (1 << 3);
91 avctx
->has_b_frames
= !(buf
[5] >> 7);
93 pc
->width
|=(horiz_size_ext
<< 12);
94 pc
->height
|=( vert_size_ext
<< 12);
95 bit_rate
= (bit_rate
&0x3FFFF) | (bit_rate_ext
<< 18);
97 ff_set_dimensions(avctx
, pc
->width
, pc
->height
);
98 avctx
->time_base
.den
= pc
->frame_rate
.den
* (frame_rate_ext_n
+ 1) * 2;
99 avctx
->time_base
.num
= pc
->frame_rate
.num
* (frame_rate_ext_d
+ 1);
100 avctx
->codec_id
= AV_CODEC_ID_MPEG2VIDEO
;
103 case 0x8: /* picture coding extension */
104 if (bytes_left
>= 5) {
105 top_field_first
= buf
[3] & (1 << 7);
106 repeat_first_field
= buf
[3] & (1 << 1);
107 progressive_frame
= buf
[4] & (1 << 7);
109 /* check if we must repeat the frame */
111 if (repeat_first_field
) {
112 if (pc
->progressive_sequence
) {
117 } else if (progressive_frame
) {
122 if (!pc
->progressive_sequence
) {
124 s
->field_order
= AV_FIELD_TT
;
126 s
->field_order
= AV_FIELD_BB
;
128 s
->field_order
= AV_FIELD_PROGRESSIVE
;
137 /* we stop parsing when we encounter a slice. It ensures
138 that this function takes a negligible amount of time */
139 if (start_code
>= SLICE_MIN_START_CODE
&&
140 start_code
<= SLICE_MAX_START_CODE
)
146 if (avctx
->codec_id
== AV_CODEC_ID_MPEG2VIDEO
&& bit_rate
) {
147 avctx
->rc_max_rate
= 400*bit_rate
;
150 ((avctx
->codec_id
== AV_CODEC_ID_MPEG1VIDEO
&& bit_rate
!= 0x3FFFF) || vbv_delay
!= 0xFFFF)) {
151 avctx
->bit_rate
= 400*bit_rate
;
155 static int mpegvideo_parse(AVCodecParserContext
*s
,
156 AVCodecContext
*avctx
,
157 const uint8_t **poutbuf
, int *poutbuf_size
,
158 const uint8_t *buf
, int buf_size
)
160 struct MpvParseContext
*pc1
= s
->priv_data
;
161 ParseContext
*pc
= &pc1
->pc
;
164 if(s
->flags
& PARSER_FLAG_COMPLETE_FRAMES
){
167 next
= ff_mpeg1_find_frame_end(pc
, buf
, buf_size
, s
);
169 if (ff_combine_frame(pc
, next
, &buf
, &buf_size
) < 0) {
176 /* we have a full frame : we just parse the first few MPEG headers
177 to have the full timing information. The time take by this
178 function should be negligible for uncorrupted streams */
179 mpegvideo_extract_headers(s
, avctx
, buf
, buf_size
);
180 av_dlog(NULL
, "pict_type=%d frame_rate=%0.3f repeat_pict=%d\n",
181 s
->pict_type
, (double)avctx
->time_base
.den
/ avctx
->time_base
.num
, s
->repeat_pict
);
184 *poutbuf_size
= buf_size
;
188 static int mpegvideo_split(AVCodecContext
*avctx
,
189 const uint8_t *buf
, int buf_size
)
195 for(i
=0; i
<buf_size
; i
++){
196 state
= (state
<<8) | buf
[i
];
199 }else if(found
&& state
!= 0x1B5 && state
< 0x200 && state
>= 0x100)
205 static int mpegvideo_parse_init(AVCodecParserContext
*s
)
207 s
->pict_type
= AV_PICTURE_TYPE_NONE
; // first frame might be partial
211 AVCodecParser ff_mpegvideo_parser
= {
212 .codec_ids
= { AV_CODEC_ID_MPEG1VIDEO
, AV_CODEC_ID_MPEG2VIDEO
},
213 .priv_data_size
= sizeof(struct MpvParseContext
),
214 .parser_init
= mpegvideo_parse_init
,
215 .parser_parse
= mpegvideo_parse
,
216 .parser_close
= ff_parse_close
,
217 .split
= mpegvideo_split
,