annotate parser.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 9a3f2beae2a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
1 /*
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
2 * Audio and Video frame extraction
8629
04423b2f6e0b cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 8044
diff changeset
3 * Copyright (c) 2003 Fabrice Bellard
04423b2f6e0b cosmetics: Remove pointless period after copyright statement non-sentences.
diego
parents: 8044
diff changeset
4 * Copyright (c) 2003 Michael Niedermayer
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
5 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
6 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
7 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
8 * FFmpeg is free software; you can redistribute it and/or
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
9 * modify it under the terms of the GNU Lesser General Public
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
10 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
11 * version 2.1 of the License, or (at your option) any later version.
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
12 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
13 * FFmpeg is distributed in the hope that it will be useful,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
16 * Lesser General Public License for more details.
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
17 *
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
18 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3776
diff changeset
19 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
21 */
4943
25cd2084129a remove no more useful includes
aurel
parents: 4941
diff changeset
22
4150
2205aefb22b7 move AVCodecParser prototypes and definitions to parser.h, and move mpegvideo parser to mpeg12.c
bcoudurier
parents: 4146
diff changeset
23 #include "parser.h"
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
24
7992
b5f5257c0c70 Mark list heads static. Patch by Diego Petten
lu_zero
parents: 6990
diff changeset
25 static AVCodecParser *av_first_parser = NULL;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
26
6011
b1fe945d73f9 av_*_next() API for libavcodec
michael
parents: 4943
diff changeset
27 AVCodecParser* av_parser_next(AVCodecParser *p){
b1fe945d73f9 av_*_next() API for libavcodec
michael
parents: 4943
diff changeset
28 if(p) return p->next;
b1fe945d73f9 av_*_next() API for libavcodec
michael
parents: 4943
diff changeset
29 else return av_first_parser;
b1fe945d73f9 av_*_next() API for libavcodec
michael
parents: 4943
diff changeset
30 }
b1fe945d73f9 av_*_next() API for libavcodec
michael
parents: 4943
diff changeset
31
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
32 void av_register_codec_parser(AVCodecParser *parser)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
33 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
34 parser->next = av_first_parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
35 av_first_parser = parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
36 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
37
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
38 AVCodecParserContext *av_parser_init(int codec_id)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
39 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
40 AVCodecParserContext *s;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
41 AVCodecParser *parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
42 int ret;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
43
2486
f2a9559db6ac 10l (array gets padded with 0 which is CODEC_ID_NONE -> parsers claim to support CODEC_ID_NONE)
michael
parents: 2480
diff changeset
44 if(codec_id == CODEC_ID_NONE)
f2a9559db6ac 10l (array gets padded with 0 which is CODEC_ID_NONE -> parsers claim to support CODEC_ID_NONE)
michael
parents: 2480
diff changeset
45 return NULL;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
46
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
47 for(parser = av_first_parser; parser != NULL; parser = parser->next) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
48 if (parser->codec_ids[0] == codec_id ||
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
49 parser->codec_ids[1] == codec_id ||
2348
d02fb928ca44 pnm parser
michael
parents: 2270
diff changeset
50 parser->codec_ids[2] == codec_id ||
d02fb928ca44 pnm parser
michael
parents: 2270
diff changeset
51 parser->codec_ids[3] == codec_id ||
d02fb928ca44 pnm parser
michael
parents: 2270
diff changeset
52 parser->codec_ids[4] == codec_id)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
53 goto found;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
54 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
55 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
56 found:
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
57 s = av_mallocz(sizeof(AVCodecParserContext));
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
58 if (!s)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
59 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
60 s->parser = parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
61 s->priv_data = av_mallocz(parser->priv_data_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
62 if (!s->priv_data) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
63 av_free(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
64 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
65 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
66 if (parser->parser_init) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
67 ret = parser->parser_init(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
68 if (ret != 0) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
69 av_free(s->priv_data);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
70 av_free(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
71 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
72 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
73 }
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
74 s->fetch_timestamp=1;
4739
9b4c5d2fb8ce set pict_type to I type during init so parsers which dont set it get all i frames, fixes mp3 seeking
michael
parents: 4679
diff changeset
75 s->pict_type = FF_I_TYPE;
8973
34f2c7189710 Add key_frame to AVCodecParserContext, used in libavformat.
cehoyos
parents: 8629
diff changeset
76 s->key_frame = -1;
12078
c70e2fd8f35d saner default value for convergence_duration
aurel
parents: 11651
diff changeset
77 s->convergence_duration = 0;
9038
d4c12f2d226b Add timestamp computation if values are exported by decoder.
cehoyos
parents: 8989
diff changeset
78 s->dts_sync_point = INT_MIN;
d4c12f2d226b Add timestamp computation if values are exported by decoder.
cehoyos
parents: 8989
diff changeset
79 s->dts_ref_dts_delta = INT_MIN;
d4c12f2d226b Add timestamp computation if values are exported by decoder.
cehoyos
parents: 8989
diff changeset
80 s->pts_dts_delta = INT_MIN;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
81 return s;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
82 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
83
6985
7c8df4f99d08 Allow matching timestamps to be removed by fetch_timestamp().
michael
parents: 6984
diff changeset
84 void ff_fetch_timestamp(AVCodecParserContext *s, int off, int remove){
6983
29a10e3232d8 Factorize fetch_timestamp() into its own function
michael
parents: 6982
diff changeset
85 int i;
6986
6ef755b234c2 cosmetic
michael
parents: 6985
diff changeset
86
6983
29a10e3232d8 Factorize fetch_timestamp() into its own function
michael
parents: 6982
diff changeset
87 s->dts= s->pts= AV_NOPTS_VALUE;
9140
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
88 s->pos= -1;
6983
29a10e3232d8 Factorize fetch_timestamp() into its own function
michael
parents: 6982
diff changeset
89 s->offset= 0;
29a10e3232d8 Factorize fetch_timestamp() into its own function
michael
parents: 6982
diff changeset
90 for(i = 0; i < AV_PARSER_PTS_NB; i++) {
9090
cecf81f93756 Call ff_fetch_timestamp() for mpeg1/2 when a picture start code is found instead
michael
parents: 9038
diff changeset
91 if ( s->cur_offset + off >= s->cur_frame_offset[i]
9878
05a510cd1e3b Fetch timestamp for the first frame of field only if frame_offset and
bcoudurier
parents: 9717
diff changeset
92 && (s->frame_offset < s->cur_frame_offset[i] ||
05a510cd1e3b Fetch timestamp for the first frame of field only if frame_offset and
bcoudurier
parents: 9717
diff changeset
93 (!s->frame_offset && !s->next_frame_offset)) // first field/frame
11651
926ad89ae57a Fix typo.
jai_menon
parents: 11556
diff changeset
94 //check is disabled because mpeg-ts doesnt send complete PES packets
6988
c67a4cff28a1 Our MPEG-TS demuxer does not send complete PES packets but sends them
michael
parents: 6986
diff changeset
95 && /*s->next_frame_offset + off <*/ s->cur_frame_end[i]){
6983
29a10e3232d8 Factorize fetch_timestamp() into its own function
michael
parents: 6982
diff changeset
96 s->dts= s->cur_frame_dts[i];
29a10e3232d8 Factorize fetch_timestamp() into its own function
michael
parents: 6982
diff changeset
97 s->pts= s->cur_frame_pts[i];
9140
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
98 s->pos= s->cur_frame_pos[i];
6983
29a10e3232d8 Factorize fetch_timestamp() into its own function
michael
parents: 6982
diff changeset
99 s->offset = s->next_frame_offset - s->cur_frame_offset[i];
6985
7c8df4f99d08 Allow matching timestamps to be removed by fetch_timestamp().
michael
parents: 6984
diff changeset
100 if(remove)
7c8df4f99d08 Allow matching timestamps to be removed by fetch_timestamp().
michael
parents: 6984
diff changeset
101 s->cur_frame_offset[i]= INT64_MAX;
9091
4875c1559060 Favor container packets that end after the first byte of the access
michael
parents: 9090
diff changeset
102 if(s->cur_offset + off < s->cur_frame_end[i])
4875c1559060 Favor container packets that end after the first byte of the access
michael
parents: 9090
diff changeset
103 break;
6983
29a10e3232d8 Factorize fetch_timestamp() into its own function
michael
parents: 6982
diff changeset
104 }
29a10e3232d8 Factorize fetch_timestamp() into its own function
michael
parents: 6982
diff changeset
105 }
29a10e3232d8 Factorize fetch_timestamp() into its own function
michael
parents: 6982
diff changeset
106 }
29a10e3232d8 Factorize fetch_timestamp() into its own function
michael
parents: 6982
diff changeset
107
3989
michael
parents: 3947
diff changeset
108 /**
michael
parents: 3947
diff changeset
109 *
michael
parents: 3947
diff changeset
110 * @param buf input
michael
parents: 3947
diff changeset
111 * @param buf_size input length, to signal EOF, this should be 0 (so that the last frame can be output)
michael
parents: 3947
diff changeset
112 * @param pts input presentation timestamp
michael
parents: 3947
diff changeset
113 * @param dts input decoding timestamp
michael
parents: 3947
diff changeset
114 * @param poutbuf will contain a pointer to the first byte of the output frame
michael
parents: 3947
diff changeset
115 * @param poutbuf_size will contain the length of the output frame
michael
parents: 3947
diff changeset
116 * @return the number of bytes of the input bitstream used
michael
parents: 3947
diff changeset
117 *
michael
parents: 3947
diff changeset
118 * Example:
michael
parents: 3947
diff changeset
119 * @code
michael
parents: 3947
diff changeset
120 * while(in_len){
michael
parents: 3947
diff changeset
121 * len = av_parser_parse(myparser, AVCodecContext, &data, &size,
michael
parents: 3947
diff changeset
122 * in_data, in_len,
michael
parents: 3947
diff changeset
123 * pts, dts);
michael
parents: 3947
diff changeset
124 * in_data += len;
michael
parents: 3947
diff changeset
125 * in_len -= len;
michael
parents: 3947
diff changeset
126 *
4310
a0c0c7bebd64 minor doc fix
michael
parents: 4177
diff changeset
127 * if(size)
a0c0c7bebd64 minor doc fix
michael
parents: 4177
diff changeset
128 * decode_frame(data, size);
3989
michael
parents: 3947
diff changeset
129 * }
michael
parents: 3947
diff changeset
130 * @endcode
9140
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
131 *
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
132 * @deprecated Use av_parser_parse2() instead.
3989
michael
parents: 3947
diff changeset
133 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
134 int av_parser_parse(AVCodecParserContext *s,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
135 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
136 uint8_t **poutbuf, int *poutbuf_size,
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
137 const uint8_t *buf, int buf_size,
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
138 int64_t pts, int64_t dts)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
139 {
9140
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
140 return av_parser_parse2(s, avctx, poutbuf, poutbuf_size, buf, buf_size, pts, dts, AV_NOPTS_VALUE);
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
141 }
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
142
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
143 int av_parser_parse2(AVCodecParserContext *s,
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
144 AVCodecContext *avctx,
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
145 uint8_t **poutbuf, int *poutbuf_size,
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
146 const uint8_t *buf, int buf_size,
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
147 int64_t pts, int64_t dts,
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
148 int64_t pos)
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
149 {
6982
abe4c0ba1be7 unused variable
michael
parents: 6980
diff changeset
150 int index, i;
1694
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
151 uint8_t dummy_buf[FF_INPUT_BUFFER_PADDING_SIZE];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
152
12529
9a3f2beae2a9 Fix index_entries pos:
cehoyos
parents: 12078
diff changeset
153 if(!(s->flags & PARSER_FLAG_FETCHED_OFFSET)) {
9a3f2beae2a9 Fix index_entries pos:
cehoyos
parents: 12078
diff changeset
154 s->next_frame_offset =
9a3f2beae2a9 Fix index_entries pos:
cehoyos
parents: 12078
diff changeset
155 s->cur_offset = pos;
9a3f2beae2a9 Fix index_entries pos:
cehoyos
parents: 12078
diff changeset
156 s->flags |= PARSER_FLAG_FETCHED_OFFSET;
9a3f2beae2a9 Fix index_entries pos:
cehoyos
parents: 12078
diff changeset
157 }
9a3f2beae2a9 Fix index_entries pos:
cehoyos
parents: 12078
diff changeset
158
1694
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
159 if (buf_size == 0) {
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
160 /* padding is always necessary even if EOF, so we add it here */
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
161 memset(dummy_buf, 0, sizeof(dummy_buf));
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
162 buf = dummy_buf;
9717
5ebac9debadf do not reference remainder packets in the parser, fix timestamps fetching
bcoudurier
parents: 9140
diff changeset
163 } else if (s->cur_offset + buf_size !=
5ebac9debadf do not reference remainder packets in the parser, fix timestamps fetching
bcoudurier
parents: 9140
diff changeset
164 s->cur_frame_end[s->cur_frame_start_index]) { /* skip remainder packets */
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
165 /* add a new packet descriptor */
6990
michael
parents: 6989
diff changeset
166 i = (s->cur_frame_start_index + 1) & (AV_PARSER_PTS_NB - 1);
michael
parents: 6989
diff changeset
167 s->cur_frame_start_index = i;
michael
parents: 6989
diff changeset
168 s->cur_frame_offset[i] = s->cur_offset;
michael
parents: 6989
diff changeset
169 s->cur_frame_end[i] = s->cur_offset + buf_size;
michael
parents: 6989
diff changeset
170 s->cur_frame_pts[i] = pts;
michael
parents: 6989
diff changeset
171 s->cur_frame_dts[i] = dts;
9140
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
172 s->cur_frame_pos[i] = pos;
6977
de032bcdeff9 Simplify parser core.
michael
parents: 6892
diff changeset
173 }
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
174
6980
michael
parents: 6979
diff changeset
175 if (s->fetch_timestamp){
michael
parents: 6979
diff changeset
176 s->fetch_timestamp=0;
6977
de032bcdeff9 Simplify parser core.
michael
parents: 6892
diff changeset
177 s->last_pts = s->pts;
de032bcdeff9 Simplify parser core.
michael
parents: 6892
diff changeset
178 s->last_dts = s->dts;
9140
322fa07fd397 Add handling of frame position in the parser.
schreter
parents: 9092
diff changeset
179 s->last_pos = s->pos;
6985
7c8df4f99d08 Allow matching timestamps to be removed by fetch_timestamp().
michael
parents: 6984
diff changeset
180 ff_fetch_timestamp(s, 0, 0);
1694
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
181 }
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
182
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
183 /* WARNING: the returned index can be negative */
4931
0d1cc37d9430 make some parser parameters const to avoid casting const to non-const
aurel
parents: 4913
diff changeset
184 index = s->parser->parser_parse(s, avctx, (const uint8_t **)poutbuf, poutbuf_size, buf, buf_size);
4122
daae66c03857 Replace most of the %lld and %llx by their (cleaner) PRI*64 counterparts.
diego
parents: 4104
diff changeset
185 //av_log(NULL, AV_LOG_DEBUG, "parser: in:%"PRId64", %"PRId64", out:%"PRId64", %"PRId64", in:%d out:%d id:%d\n", pts, dts, s->last_pts, s->last_dts, buf_size, *poutbuf_size, avctx->codec_id);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
186 /* update the file pointer */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
187 if (*poutbuf_size) {
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
188 /* fill the data for the current frame */
6979
4257fdcf664e Rename last_frame_offset to next_frame_offset.
michael
parents: 6977
diff changeset
189 s->frame_offset = s->next_frame_offset;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
190
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
191 /* offset of the next frame */
6979
4257fdcf664e Rename last_frame_offset to next_frame_offset.
michael
parents: 6977
diff changeset
192 s->next_frame_offset = s->cur_offset + index;
6980
michael
parents: 6979
diff changeset
193 s->fetch_timestamp=1;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
194 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
195 if (index < 0)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
196 index = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
197 s->cur_offset += index;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
198 return index;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
199 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
200
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
201 /**
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
202 *
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
203 * @return 0 if the output buffer is a subset of the input, 1 if it is allocated and must be freed
3421
b7826511f7b6 AVBitStreamFilter (some thingy which can modify the bitstream like add or remove global headers or change the headers or ...)
michael
parents: 3395
diff changeset
204 * @deprecated use AVBitstreamFilter
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
205 */
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
206 int av_parser_change(AVCodecParserContext *s,
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
207 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
208 uint8_t **poutbuf, int *poutbuf_size,
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
209 const uint8_t *buf, int buf_size, int keyframe){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
210
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
211 if(s && s->parser->split){
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
212 if((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) || (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER)){
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
213 int i= s->parser->split(avctx, buf, buf_size);
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
214 buf += i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
215 buf_size -= i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
216 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
217 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
218
2864
95bac7109ff0 Kill some compiler warnings. Compiled code verified identical after changes.
mru
parents: 2846
diff changeset
219 /* cast to avoid warning about discarding qualifiers */
95bac7109ff0 Kill some compiler warnings. Compiled code verified identical after changes.
mru
parents: 2846
diff changeset
220 *poutbuf= (uint8_t *) buf;
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
221 *poutbuf_size= buf_size;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
222 if(avctx->extradata){
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
223 if( (keyframe && (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER))
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6011
diff changeset
224 /*||(s->pict_type != FF_I_TYPE && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_NOKEY))*/
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
225 /*||(? && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_BEGIN)*/){
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
226 int size= buf_size + avctx->extradata_size;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
227 *poutbuf_size= size;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
228 *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
229
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
230 memcpy(*poutbuf, avctx->extradata, avctx->extradata_size);
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
231 memcpy((*poutbuf) + avctx->extradata_size, buf, buf_size + FF_INPUT_BUFFER_PADDING_SIZE);
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
232 return 1;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
233 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
234 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
235
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
236 return 0;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
237 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
238
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
239 void av_parser_close(AVCodecParserContext *s)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
240 {
6891
d7051562c2b3 allow av_parser_close(NULL)
michael
parents: 6534
diff changeset
241 if(s){
6892
michael
parents: 6891
diff changeset
242 if (s->parser->parser_close)
michael
parents: 6891
diff changeset
243 s->parser->parser_close(s);
michael
parents: 6891
diff changeset
244 av_free(s->priv_data);
michael
parents: 6891
diff changeset
245 av_free(s);
6891
d7051562c2b3 allow av_parser_close(NULL)
michael
parents: 6534
diff changeset
246 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
247 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
248
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
249 /*****************************************************/
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
250
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
251 /**
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
252 * combines the (truncated) bitstream to a complete frame
11556
b94e1810ce4c Replace @returns by @return.
benoit
parents: 9878
diff changeset
253 * @return -1 if no complete frame could be created, AVERROR(ENOMEM) if there was a memory allocation error
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
254 */
4931
0d1cc37d9430 make some parser parameters const to avoid casting const to non-const
aurel
parents: 4913
diff changeset
255 int ff_combine_frame(ParseContext *pc, int next, const uint8_t **buf, int *buf_size)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
256 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
257 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
258 if(pc->overread){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
259 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
260 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
261 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
262 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
263
4795
522e52c630bd typos/grammar
diego
parents: 4739
diff changeset
264 /* Copy overread bytes from last frame into buffer. */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
265 for(; pc->overread>0; pc->overread--){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
266 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
267 }
2386
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
268
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
269 /* flush remaining if EOF */
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
270 if(!*buf_size && next == END_NOT_FOUND){
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
271 next= 0;
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
272 }
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
273
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
274 pc->last_index= pc->index;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
275
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
276 /* copy into buffer end return */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
277 if(next == END_NOT_FOUND){
6534
23b2a64342f2 Return an error when realloc fails.
benoit
parents: 6481
diff changeset
278 void* new_buffer = av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
279
6534
23b2a64342f2 Return an error when realloc fails.
benoit
parents: 6481
diff changeset
280 if(!new_buffer)
23b2a64342f2 Return an error when realloc fails.
benoit
parents: 6481
diff changeset
281 return AVERROR(ENOMEM);
23b2a64342f2 Return an error when realloc fails.
benoit
parents: 6481
diff changeset
282 pc->buffer = new_buffer;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
283 memcpy(&pc->buffer[pc->index], *buf, *buf_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
284 pc->index += *buf_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
285 return -1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
286 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
287
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
288 *buf_size=
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
289 pc->overread_index= pc->index + next;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
290
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
291 /* append to buffer */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
292 if(pc->index){
6534
23b2a64342f2 Return an error when realloc fails.
benoit
parents: 6481
diff changeset
293 void* new_buffer = av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
294
6534
23b2a64342f2 Return an error when realloc fails.
benoit
parents: 6481
diff changeset
295 if(!new_buffer)
23b2a64342f2 Return an error when realloc fails.
benoit
parents: 6481
diff changeset
296 return AVERROR(ENOMEM);
23b2a64342f2 Return an error when realloc fails.
benoit
parents: 6481
diff changeset
297 pc->buffer = new_buffer;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
298 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
299 pc->index = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
300 *buf= pc->buffer;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
301 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
302
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
303 /* store overread bytes */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
304 for(;next < 0; next++){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
305 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
8044
8c1e1047ec78 add state64 field to ParseContext storing last 8 bytes, to be able to check for longer startcodes
bcoudurier
parents: 8040
diff changeset
306 pc->state64 = (pc->state64<<8) | pc->buffer[pc->last_index + next];
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
307 pc->overread++;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
308 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
309
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
310 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
311 if(pc->overread){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
312 printf("overread %d, state:%X next:%d index:%d o_index:%d\n", pc->overread, pc->state, next, pc->index, pc->overread_index);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
313 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
314 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
315 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
316
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
317 return 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
318 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
319
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
320 void ff_parse_close(AVCodecParserContext *s)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
321 {
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
322 ParseContext *pc = s->priv_data;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
323
8040
def5fcc1d40e Use av_freep() in ff_parse_close().
michael
parents: 7992
diff changeset
324 av_freep(&pc->buffer);
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
325 }
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
326
4150
2205aefb22b7 move AVCodecParser prototypes and definitions to parser.h, and move mpegvideo parser to mpeg12.c
bcoudurier
parents: 4146
diff changeset
327 void ff_parse1_close(AVCodecParserContext *s)
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
328 {
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
329 ParseContext1 *pc1 = s->priv_data;
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
330
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
331 av_free(pc1->pc.buffer);
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
332 av_free(pc1->enc);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
333 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
334
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
335 /*************************/
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
336
4175
b3328ed50a5e make mpeg4video_split public as ff_mpeg4video_split
stefang
parents: 4150
diff changeset
337 int ff_mpeg4video_split(AVCodecContext *avctx,
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
338 const uint8_t *buf, int buf_size)
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
339 {
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
340 int i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
341 uint32_t state= -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
342
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
343 for(i=0; i<buf_size; i++){
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
344 state= (state<<8) | buf[i];
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
345 if(state == 0x1B3 || state == 0x1B6)
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
346 return i-3;
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
347 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
348 return 0;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
349 }