Mercurial > libavcodec.hg
annotate mpegvideo_parser.c @ 7744:7477cbdacb20 libavcodec
Fix lossless jpeg encoder to comply to spec and store full redundant
residuals, Note this does not change RGB32 as we need to check this
against some decoder that supports it.
author | michael |
---|---|
date | Sat, 30 Aug 2008 20:39:12 +0000 |
parents | 5a5ded44808a |
children | 04423b2f6e0b |
rev | line source |
---|---|
4915 | 1 /* |
2 * MPEG1 / MPEG2 video parser | |
3 * Copyright (c) 2000,2001 Fabrice Bellard. | |
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> | |
5 * | |
6 * This file is part of FFmpeg. | |
7 * | |
8 * FFmpeg is free software; you can redistribute it and/or | |
9 * modify it under the terms of the GNU Lesser General Public | |
10 * License as published by the Free Software Foundation; either | |
11 * version 2.1 of the License, or (at your option) any later version. | |
12 * | |
13 * FFmpeg is distributed in the hope that it will be useful, | |
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
16 * Lesser General Public License for more details. | |
17 * | |
18 * You should have received a copy of the GNU Lesser General Public | |
19 * License along with FFmpeg; if not, write to the Free Software | |
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
21 */ | |
22 | |
23 #include "parser.h" | |
24 #include "mpegvideo.h" | |
25 | |
26 static void mpegvideo_extract_headers(AVCodecParserContext *s, | |
27 AVCodecContext *avctx, | |
28 const uint8_t *buf, int buf_size) | |
29 { | |
30 ParseContext1 *pc = s->priv_data; | |
31 const uint8_t *buf_end; | |
6994
5a5ded44808a
In mpeg1/2 timestamps are associated with the access unit which
michael
parents:
6564
diff
changeset
|
32 const uint8_t *buf_start= buf; |
4915 | 33 uint32_t start_code; |
34 int frame_rate_index, ext_type, bytes_left; | |
35 int frame_rate_ext_n, frame_rate_ext_d; | |
36 int picture_structure, top_field_first, repeat_first_field, progressive_frame; | |
37 int horiz_size_ext, vert_size_ext, bit_rate_ext; | |
38 //FIXME replace the crap with get_bits() | |
39 s->repeat_pict = 0; | |
40 buf_end = buf + buf_size; | |
41 while (buf < buf_end) { | |
42 start_code= -1; | |
43 buf= ff_find_start_code(buf, buf_end, &start_code); | |
44 bytes_left = buf_end - buf; | |
45 switch(start_code) { | |
46 case PICTURE_START_CODE: | |
6994
5a5ded44808a
In mpeg1/2 timestamps are associated with the access unit which
michael
parents:
6564
diff
changeset
|
47 ff_fetch_timestamp(s, buf-buf_start-4, 1); |
5a5ded44808a
In mpeg1/2 timestamps are associated with the access unit which
michael
parents:
6564
diff
changeset
|
48 |
4915 | 49 if (bytes_left >= 2) { |
50 s->pict_type = (buf[1] >> 3) & 7; | |
51 } | |
52 break; | |
53 case SEQ_START_CODE: | |
54 if (bytes_left >= 7) { | |
55 pc->width = (buf[0] << 4) | (buf[1] >> 4); | |
56 pc->height = ((buf[1] & 0x0f) << 8) | buf[2]; | |
57 avcodec_set_dimensions(avctx, pc->width, pc->height); | |
58 frame_rate_index = buf[3] & 0xf; | |
59 pc->frame_rate.den = avctx->time_base.den = ff_frame_rate_tab[frame_rate_index].num; | |
60 pc->frame_rate.num = avctx->time_base.num = ff_frame_rate_tab[frame_rate_index].den; | |
61 avctx->bit_rate = ((buf[4]<<10) | (buf[5]<<2) | (buf[6]>>6))*400; | |
62 avctx->codec_id = CODEC_ID_MPEG1VIDEO; | |
63 avctx->sub_id = 1; | |
64 } | |
65 break; | |
66 case EXT_START_CODE: | |
67 if (bytes_left >= 1) { | |
68 ext_type = (buf[0] >> 4); | |
69 switch(ext_type) { | |
70 case 0x1: /* sequence extension */ | |
71 if (bytes_left >= 6) { | |
72 horiz_size_ext = ((buf[1] & 1) << 1) | (buf[2] >> 7); | |
73 vert_size_ext = (buf[2] >> 5) & 3; | |
74 bit_rate_ext = ((buf[2] & 0x1F)<<7) | (buf[3]>>1); | |
75 frame_rate_ext_n = (buf[5] >> 5) & 3; | |
76 frame_rate_ext_d = (buf[5] & 0x1f); | |
77 pc->progressive_sequence = buf[1] & (1 << 3); | |
78 avctx->has_b_frames= !(buf[5] >> 7); | |
79 | |
80 pc->width |=(horiz_size_ext << 12); | |
81 pc->height |=( vert_size_ext << 12); | |
82 avctx->bit_rate += (bit_rate_ext << 18) * 400; | |
83 avcodec_set_dimensions(avctx, pc->width, pc->height); | |
84 avctx->time_base.den = pc->frame_rate.den * (frame_rate_ext_n + 1); | |
85 avctx->time_base.num = pc->frame_rate.num * (frame_rate_ext_d + 1); | |
86 avctx->codec_id = CODEC_ID_MPEG2VIDEO; | |
87 avctx->sub_id = 2; /* forces MPEG2 */ | |
88 } | |
89 break; | |
90 case 0x8: /* picture coding extension */ | |
91 if (bytes_left >= 5) { | |
92 picture_structure = buf[2]&3; | |
93 top_field_first = buf[3] & (1 << 7); | |
94 repeat_first_field = buf[3] & (1 << 1); | |
95 progressive_frame = buf[4] & (1 << 7); | |
96 | |
97 /* check if we must repeat the frame */ | |
98 if (repeat_first_field) { | |
99 if (pc->progressive_sequence) { | |
100 if (top_field_first) | |
101 s->repeat_pict = 4; | |
102 else | |
103 s->repeat_pict = 2; | |
104 } else if (progressive_frame) { | |
105 s->repeat_pict = 1; | |
106 } | |
107 } | |
108 } | |
109 break; | |
110 } | |
111 } | |
112 break; | |
113 case -1: | |
114 goto the_end; | |
115 default: | |
116 /* we stop parsing when we encounter a slice. It ensures | |
117 that this function takes a negligible amount of time */ | |
118 if (start_code >= SLICE_MIN_START_CODE && | |
119 start_code <= SLICE_MAX_START_CODE) | |
120 goto the_end; | |
121 break; | |
122 } | |
123 } | |
124 the_end: ; | |
125 } | |
126 | |
127 static int mpegvideo_parse(AVCodecParserContext *s, | |
128 AVCodecContext *avctx, | |
4931
0d1cc37d9430
make some parser parameters const to avoid casting const to non-const
aurel
parents:
4916
diff
changeset
|
129 const uint8_t **poutbuf, int *poutbuf_size, |
4915 | 130 const uint8_t *buf, int buf_size) |
131 { | |
132 ParseContext1 *pc1 = s->priv_data; | |
133 ParseContext *pc= &pc1->pc; | |
134 int next; | |
135 | |
136 if(s->flags & PARSER_FLAG_COMPLETE_FRAMES){ | |
137 next= buf_size; | |
138 }else{ | |
4916
13ef168891b0
add a ff_ prefix to the now exported mpeg1_find_frame_end() function
aurel
parents:
4915
diff
changeset
|
139 next= ff_mpeg1_find_frame_end(pc, buf, buf_size); |
4915 | 140 |
4931
0d1cc37d9430
make some parser parameters const to avoid casting const to non-const
aurel
parents:
4916
diff
changeset
|
141 if (ff_combine_frame(pc, next, &buf, &buf_size) < 0) { |
4915 | 142 *poutbuf = NULL; |
143 *poutbuf_size = 0; | |
144 return buf_size; | |
145 } | |
146 | |
147 } | |
148 /* we have a full frame : we just parse the first few MPEG headers | |
149 to have the full timing information. The time take by this | |
150 function should be negligible for uncorrupted streams */ | |
151 mpegvideo_extract_headers(s, avctx, buf, buf_size); | |
152 #if 0 | |
153 printf("pict_type=%d frame_rate=%0.3f repeat_pict=%d\n", | |
154 s->pict_type, (double)avctx->time_base.den / avctx->time_base.num, s->repeat_pict); | |
155 #endif | |
156 | |
4931
0d1cc37d9430
make some parser parameters const to avoid casting const to non-const
aurel
parents:
4916
diff
changeset
|
157 *poutbuf = buf; |
4915 | 158 *poutbuf_size = buf_size; |
159 return next; | |
160 } | |
161 | |
162 static int mpegvideo_split(AVCodecContext *avctx, | |
163 const uint8_t *buf, int buf_size) | |
164 { | |
165 int i; | |
166 uint32_t state= -1; | |
167 | |
168 for(i=0; i<buf_size; i++){ | |
169 state= (state<<8) | buf[i]; | |
170 if(state != 0x1B3 && state != 0x1B5 && state < 0x200 && state >= 0x100) | |
171 return i-3; | |
172 } | |
173 return 0; | |
174 } | |
175 | |
176 AVCodecParser mpegvideo_parser = { | |
177 { CODEC_ID_MPEG1VIDEO, CODEC_ID_MPEG2VIDEO }, | |
178 sizeof(ParseContext1), | |
179 NULL, | |
180 mpegvideo_parse, | |
181 ff_parse1_close, | |
182 }; |