annotate parser.c @ 5441:7b8fd76dba47 libavcodec

change for(){ if(){ switch(){ to switch(){ for(){ if(){ this halfs the number of times the switch is executed in bidir blocks, in other blocks the number is the same 25 cpu cycles less with matrixbench on duron
author michael
date Wed, 01 Aug 2007 20:37:41 +0000
parents 25cd2084129a
children b1fe945d73f9
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
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
3 * Copyright (c) 2003 Fabrice Bellard.
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
4 * Copyright (c) 2003 Michael Niedermayer.
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
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
25 AVCodecParser *av_first_parser = NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
26
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
27 void av_register_codec_parser(AVCodecParser *parser)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
28 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
29 parser->next = av_first_parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
30 av_first_parser = parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
31 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
32
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
33 AVCodecParserContext *av_parser_init(int codec_id)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
34 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
35 AVCodecParserContext *s;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
36 AVCodecParser *parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
37 int ret;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
38
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
39 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
40 return NULL;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
41
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
42 for(parser = av_first_parser; parser != NULL; parser = parser->next) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
43 if (parser->codec_ids[0] == codec_id ||
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
44 parser->codec_ids[1] == codec_id ||
2348
d02fb928ca44 pnm parser
michael
parents: 2270
diff changeset
45 parser->codec_ids[2] == codec_id ||
d02fb928ca44 pnm parser
michael
parents: 2270
diff changeset
46 parser->codec_ids[3] == codec_id ||
d02fb928ca44 pnm parser
michael
parents: 2270
diff changeset
47 parser->codec_ids[4] == codec_id)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
48 goto found;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
49 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
50 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
51 found:
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
52 s = av_mallocz(sizeof(AVCodecParserContext));
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
53 if (!s)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
54 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
55 s->parser = parser;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
56 s->priv_data = av_mallocz(parser->priv_data_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
57 if (!s->priv_data) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
58 av_free(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 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
61 if (parser->parser_init) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
62 ret = parser->parser_init(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
63 if (ret != 0) {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
64 av_free(s->priv_data);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
65 av_free(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
66 return NULL;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
67 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
68 }
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
69 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
70 s->pict_type = FF_I_TYPE;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
71 return s;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
72 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
73
3989
michael
parents: 3947
diff changeset
74 /**
michael
parents: 3947
diff changeset
75 *
michael
parents: 3947
diff changeset
76 * @param buf input
michael
parents: 3947
diff changeset
77 * @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
78 * @param pts input presentation timestamp
michael
parents: 3947
diff changeset
79 * @param dts input decoding timestamp
michael
parents: 3947
diff changeset
80 * @param poutbuf will contain a pointer to the first byte of the output frame
michael
parents: 3947
diff changeset
81 * @param poutbuf_size will contain the length of the output frame
michael
parents: 3947
diff changeset
82 * @return the number of bytes of the input bitstream used
michael
parents: 3947
diff changeset
83 *
michael
parents: 3947
diff changeset
84 * Example:
michael
parents: 3947
diff changeset
85 * @code
michael
parents: 3947
diff changeset
86 * while(in_len){
michael
parents: 3947
diff changeset
87 * len = av_parser_parse(myparser, AVCodecContext, &data, &size,
michael
parents: 3947
diff changeset
88 * in_data, in_len,
michael
parents: 3947
diff changeset
89 * pts, dts);
michael
parents: 3947
diff changeset
90 * in_data += len;
michael
parents: 3947
diff changeset
91 * in_len -= len;
michael
parents: 3947
diff changeset
92 *
4310
a0c0c7bebd64 minor doc fix
michael
parents: 4177
diff changeset
93 * if(size)
a0c0c7bebd64 minor doc fix
michael
parents: 4177
diff changeset
94 * decode_frame(data, size);
3989
michael
parents: 3947
diff changeset
95 * }
michael
parents: 3947
diff changeset
96 * @endcode
michael
parents: 3947
diff changeset
97 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
98 int av_parser_parse(AVCodecParserContext *s,
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
99 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
100 uint8_t **poutbuf, int *poutbuf_size,
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
101 const uint8_t *buf, int buf_size,
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
102 int64_t pts, int64_t dts)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
103 {
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
104 int index, i, k;
1694
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
105 uint8_t dummy_buf[FF_INPUT_BUFFER_PADDING_SIZE];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
106
1694
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
107 if (buf_size == 0) {
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
108 /* 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
109 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
110 buf = dummy_buf;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
111 } else {
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
112 /* add a new packet descriptor */
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
113 k = (s->cur_frame_start_index + 1) & (AV_PARSER_PTS_NB - 1);
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
114 s->cur_frame_start_index = k;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
115 s->cur_frame_offset[k] = s->cur_offset;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
116 s->cur_frame_pts[k] = pts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
117 s->cur_frame_dts[k] = dts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
118
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
119 /* fill first PTS/DTS */
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
120 if (s->fetch_timestamp){
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
121 s->fetch_timestamp=0;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
122 s->last_pts = pts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
123 s->last_dts = dts;
4846
841ecebff8c8 timestamps generation improvement when parsing avi
benoit
parents: 4795
diff changeset
124 s->last_offset = 0;
2107
bec4623c2201 timestamp duplication bugfix
michael
parents: 2030
diff changeset
125 s->cur_frame_pts[k] =
bec4623c2201 timestamp duplication bugfix
michael
parents: 2030
diff changeset
126 s->cur_frame_dts[k] = AV_NOPTS_VALUE;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
127 }
1694
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
128 }
13169235c306 added End Of File handling to return last picture for MPEG1/2/4
bellard
parents: 1681
diff changeset
129
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
130 /* 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
131 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
132 //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
133 /* update the file pointer */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
134 if (*poutbuf_size) {
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
135 /* fill the data for the current frame */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
136 s->frame_offset = s->last_frame_offset;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
137 s->pts = s->last_pts;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
138 s->dts = s->last_dts;
4846
841ecebff8c8 timestamps generation improvement when parsing avi
benoit
parents: 4795
diff changeset
139 s->offset = s->last_offset;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
140
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
141 /* offset of the next frame */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
142 s->last_frame_offset = s->cur_offset + index;
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
143 /* find the packet in which the new frame starts. It
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
144 is tricky because of MPEG video start codes
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
145 which can begin in one packet and finish in
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
146 another packet. In the worst case, an MPEG
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
147 video start code could be in 4 different
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
148 packets. */
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
149 k = s->cur_frame_start_index;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
150 for(i = 0; i < AV_PARSER_PTS_NB; i++) {
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
151 if (s->last_frame_offset >= s->cur_frame_offset[k])
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
152 break;
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
153 k = (k - 1) & (AV_PARSER_PTS_NB - 1);
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
154 }
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
155
1696
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
156 s->last_pts = s->cur_frame_pts[k];
f5af91b8be17 pts and dts support in parser API
bellard
parents: 1694
diff changeset
157 s->last_dts = s->cur_frame_dts[k];
4846
841ecebff8c8 timestamps generation improvement when parsing avi
benoit
parents: 4795
diff changeset
158 s->last_offset = s->last_frame_offset - s->cur_frame_offset[k];
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
159
2030
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
160 /* some parsers tell us the packet size even before seeing the first byte of the next packet,
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
161 so the next pts/dts is in the next chunk */
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
162 if(index == buf_size){
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
163 s->fetch_timestamp=1;
f796043935f3 mpeg audio timestamp fix
michael
parents: 2024
diff changeset
164 }
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
165 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
166 if (index < 0)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
167 index = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
168 s->cur_offset += index;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
169 return index;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
170 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
171
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
172 /**
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
173 *
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
174 * @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
175 * @deprecated use AVBitstreamFilter
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
176 */
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
177 int av_parser_change(AVCodecParserContext *s,
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
178 AVCodecContext *avctx,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
179 uint8_t **poutbuf, int *poutbuf_size,
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
180 const uint8_t *buf, int buf_size, int keyframe){
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
181
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
182 if(s && s->parser->split){
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
183 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
184 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
185 buf += i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
186 buf_size -= i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
187 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
188 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
189
2864
95bac7109ff0 Kill some compiler warnings. Compiled code verified identical after changes.
mru
parents: 2846
diff changeset
190 /* cast to avoid warning about discarding qualifiers */
95bac7109ff0 Kill some compiler warnings. Compiled code verified identical after changes.
mru
parents: 2846
diff changeset
191 *poutbuf= (uint8_t *) buf;
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
192 *poutbuf_size= buf_size;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
193 if(avctx->extradata){
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
194 if( (keyframe && (avctx->flags2 & CODEC_FLAG2_LOCAL_HEADER))
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
195 /*||(s->pict_type != I_TYPE && (s->flags & PARSER_FLAG_DUMP_EXTRADATA_AT_NOKEY))*/
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
196 /*||(? && (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
197 int size= buf_size + avctx->extradata_size;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
198 *poutbuf_size= size;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
199 *poutbuf= av_malloc(size + FF_INPUT_BUFFER_PADDING_SIZE);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
200
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
201 memcpy(*poutbuf, avctx->extradata, avctx->extradata_size);
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
202 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
203 return 1;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
204 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
205 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
206
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
207 return 0;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
208 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
209
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
210 void av_parser_close(AVCodecParserContext *s)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
211 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
212 if (s->parser->parser_close)
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
213 s->parser->parser_close(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
214 av_free(s->priv_data);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
215 av_free(s);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
216 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
217
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
218 /*****************************************************/
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
219
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
220 /**
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
221 * combines the (truncated) bitstream to a complete frame
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
222 * @returns -1 if no complete frame could be created
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
223 */
4931
0d1cc37d9430 make some parser parameters const to avoid casting const to non-const
aurel
parents: 4913
diff changeset
224 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
225 {
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
226 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
227 if(pc->overread){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
228 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
229 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
230 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
231 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
232
4795
522e52c630bd typos/grammar
diego
parents: 4739
diff changeset
233 /* Copy overread bytes from last frame into buffer. */
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
234 for(; pc->overread>0; pc->overread--){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
235 pc->buffer[pc->index++]= pc->buffer[pc->overread_index++];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
236 }
2386
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
237
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
238 /* flush remaining if EOF */
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
239 if(!*buf_size && next == END_NOT_FOUND){
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
240 next= 0;
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
241 }
8d1983254e28 flush remaining data from parser at EOF
michael
parents: 2348
diff changeset
242
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
243 pc->last_index= pc->index;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
244
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
245 /* copy into buffer end return */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
246 if(next == END_NOT_FOUND){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
247 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
248
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
249 memcpy(&pc->buffer[pc->index], *buf, *buf_size);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
250 pc->index += *buf_size;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
251 return -1;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
252 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
253
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
254 *buf_size=
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
255 pc->overread_index= pc->index + next;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
256
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
257 /* append to buffer */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
258 if(pc->index){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
259 pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
260
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
261 memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE );
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
262 pc->index = 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
263 *buf= pc->buffer;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
264 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
265
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
266 /* store overread bytes */
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
267 for(;next < 0; next++){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
268 pc->state = (pc->state<<8) | pc->buffer[pc->last_index + next];
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
269 pc->overread++;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
270 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
271
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
272 #if 0
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
273 if(pc->overread){
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
274 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
275 printf("%X %X %X %X\n", (*buf)[0], (*buf)[1],(*buf)[2],(*buf)[3]);
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
276 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
277 #endif
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
278
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
279 return 0;
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
280 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
281
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
282 void ff_parse_close(AVCodecParserContext *s)
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
283 {
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
284 ParseContext *pc = s->priv_data;
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
285
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
286 av_free(pc->buffer);
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
287 }
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
288
4150
2205aefb22b7 move AVCodecParser prototypes and definitions to parser.h, and move mpegvideo parser to mpeg12.c
bcoudurier
parents: 4146
diff changeset
289 void ff_parse1_close(AVCodecParserContext *s)
1988
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
290 {
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
291 ParseContext1 *pc1 = s->priv_data;
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
292
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
293 av_free(pc1->pc.buffer);
b5753525f9a8 remove duplicated find_frame_end() code
michael
parents: 1987
diff changeset
294 av_free(pc1->enc);
1613
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
295 }
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
296
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
297 /*************************/
0279c6c61f11 new audio/video parser API
bellard
parents:
diff changeset
298
4175
b3328ed50a5e make mpeg4video_split public as ff_mpeg4video_split
stefang
parents: 4150
diff changeset
299 int ff_mpeg4video_split(AVCodecContext *avctx,
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
300 const uint8_t *buf, int buf_size)
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
301 {
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
302 int i;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
303 uint32_t state= -1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2864
diff changeset
304
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
305 for(i=0; i<buf_size; i++){
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
306 state= (state<<8) | buf[i];
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
307 if(state == 0x1B3 || state == 0x1B6)
2777
09108466b7d0 off by 1 error bugfix
michael
parents: 2769
diff changeset
308 return i-3;
2769
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
309 }
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
310 return 0;
1394b45a7bf4 support changing in bitstream global headers into extradata style and back
michael
parents: 2637
diff changeset
311 }