1 /*
2 * H.26L/H.264/AVC/JVT/14496-10/... parser
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 /**
23 * @file
24 * H.264 / AVC / MPEG4 part10 parser.
25 * @author Michael Niedermayer <michaelni@gmx.at>
26 */
27
28 #define UNCHECKED_BITSTREAM_READER 1
29
35
36
38 int buf_size)
39 {
40 int i, j;
43 int next_avc= h->
is_avc ? 0 : buf_size;
44
45 // mb_addr= pc->mb_addr - 1;
47 if (state > 13)
48 state = 7;
49
52
53 for (i = 0; i < buf_size; i++) {
54 if (i >= next_avc) {
55 int nalsize = 0;
56 i = next_avc;
58 nalsize = (nalsize << 8) | buf[i++];
59 if (nalsize <= 0 || nalsize > buf_size - i) {
61 return buf_size;
62 }
63 next_avc = i + nalsize;
64 state = 5;
65 }
66
67 if (state == 7) {
68 #if HAVE_FAST_UNALIGNED
69 /* we check i < buf_size instead of i + 3 / 7 because it is
70 * simpler and there must be FF_INPUT_BUFFER_PADDING_SIZE
71 * bytes at the end.
72 */
73 # if HAVE_FAST_64BIT
74 while (i < next_avc &&
75 !((~*(const uint64_t *)(buf + i) &
76 (*(const uint64_t *)(buf + i) - 0x0101010101010101ULL)) &
77 0x8080808080808080ULL))
78 i += 8;
79 # else
80 while (i < next_avc &&
81 !((~*(const uint32_t *)(buf + i) &
82 (*(const uint32_t *)(buf + i) - 0x01010101U)) &
83 0x80808080U))
84 i += 4;
85 # endif
86 #endif
87 for (; i < next_avc; i++)
88 if (!buf[i]) {
89 state = 2;
90 break;
91 }
92 } else if (state <= 2) {
93 if (buf[i] == 1)
94 state ^= 5; // 2->7, 1->4, 0->5
95 else if (buf[i])
96 state = 7;
97 else
98 state >>= 1; // 2->1, 1->0, 0->0
99 } else if (state <= 5) {
100 int v = buf[i] & 0x1F;
101 if (v == 6 || v == 7 || v == 8 || v == 9) {
103 i++;
104 goto found;
105 }
106 } else if (v == 1 || v == 2 || v == 5) {
107 state += 8;
108 continue;
109 }
110 state = 7;
111 } else {
116
123 if (mb <= last_mb)
124 goto found;
125 } else
127 state = 7;
128 }
129 }
130 }
133 return next_avc;
135
136 found:
140 return next_avc;
141 return i - (state & 5) - 3 * (state > 7);
142 }
143
144 /**
145 * Parse NAL units of found picture and decode some basic information.
146 *
147 * @param s parser context.
148 * @param avctx codec context.
149 * @param buf buffer with field/frame data.
150 * @param buf_size size of the buffer.
151 */
155 {
157 const uint8_t *buf_end = buf + buf_size;
158 unsigned int pps_id;
159 unsigned int slice_type;
162 int q264 = buf_size >=4 && !memcmp("Q264", buf, 4);
163 int field_poc[2];
164
165 /* set some sane default values */
169
175
176 if (!buf_size)
177 return 0;
178
179 for (;;) {
180 int src_length, dst_length, consumed, nalsize = 0;
182 int i;
184 nalsize = 0;
186 nalsize = (nalsize << 8) | *buf++;
187 if (nalsize <= 0 || nalsize > buf_end - buf) {
189 break;
190 }
191 src_length = nalsize;
192 } else {
194 if (buf >= buf_end)
195 break;
197 src_length = buf_end -
buf;
198 }
199 switch (state & 0x1f) {
202 // Do not walk the whole buffer just to decode slice header
203 if (src_length > 20)
204 src_length = 20;
205 break;
206 }
208 if (ptr == NULL || dst_length < 0)
209 break;
210
215 break;
218 break;
221 break;
224
229 /* fall through */
235 /* key frame, since recovery_frame_cnt is set */
237 }
241 "pps_id out of range\n");
242 return -1;
243 }
246 "non-existing PPS referenced\n");
247 return -1;
248 }
252 "non-existing SPS referenced\n");
253 return -1;
254 }
257
260
263 } else {
266 } else {
268 }
269 }
270
275
279 }
280
284
288 }
289
291
297 break;
302 break;
306 break;
309 break;
312 break;
313 default:
315 break;
316 }
317 } else {
319 }
320
328 break;
332 break;
333 default:
335 break;
336 }
337 } else {
338 if (field_poc[0] < field_poc[1])
340 else if (field_poc[0] > field_poc[1])
342 else
344 }
345 } else {
348 else
351 }
352
353 return 0; /* no need to evaluate the rest */
354 }
355 buf += h->
is_avc ? nalsize : consumed;
356 }
357 if (q264)
358 return 0;
359 /* didn't find a picture! */
361 return -1;
362 }
363
366 const uint8_t **poutbuf,
int *poutbuf_size,
368 {
371 int next;
372
377 // must be done like in decoder, otherwise opening the parser,
378 // letting it create extradata and then closing and opening again
379 // will cause has_b_frames to be always set.
380 // Note that estimate_timings_from_pts does exactly this.
384 }
385 }
386
388 next = buf_size;
389 } else {
391
393 *poutbuf = NULL;
394 *poutbuf_size = 0;
395 return buf_size;
396 }
397
401 }
402 }
403
405
410 } else {
414 }
415
418 }
419
421 *poutbuf_size = buf_size;
422 return next;
423 }
424
427 {
428 int i;
430 int has_sps = 0;
431
432 for (i = 0; i <= buf_size; i++) {
433 if ((state & 0xFFFFFF1F) == 0x107)
434 has_sps = 1;
435 /* if ((state&0xFFFFFF1F) == 0x101 ||
436 * (state&0xFFFFFF1F) == 0x102 ||
437 * (state&0xFFFFFF1F) == 0x105) {
438 * }
439 */
440 if ((state & 0xFFFFFF00) == 0x100 && (state & 0xFFFFFF1F) != 0x107 &&
441 (state & 0xFFFFFF1F) != 0x108 && (state & 0xFFFFFF1F) != 0x109) {
442 if (has_sps) {
443 while (i > 4 && buf[i - 5] == 0)
444 i--;
445 return i - 4;
446 }
447 }
448 if (i < buf_size)
449 state = (state << 8) | buf[i];
450 }
451 return 0;
452 }
453
455 {
458
461 }
462
464 {
468 return 0;
469 }
470
476 .parser_close =
close,
478 };