1 /*
2 * Audio and Video frame extraction
3 * Copyright (c) 2003 Fabrice Bellard
4 * Copyright (c) 2003 Michael Niedermayer
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 <stdint.h>
24 #include <string.h>
25
29
32
34
36 {
37 if (p)
39 else
41 }
42
44 {
45 do {
48 }
49
51 {
55
58
59 for (parser = av_first_parser; parser; parser = parser->
next) {
65 goto found;
66 }
68
69 found:
71 if (!s)
72 goto err_out;
76 goto err_out;
81 if (ret != 0)
82 goto err_out;
83 }
90
92
93 err_out:
94 if (s)
98 }
99
101 {
102 int i;
103
104 if (!fuzzy) {
109 }
114 // check disabled since MPEG-TS does not send complete PES packets
116
122 }
123 if (remove)
125 if (s->
cur_offset + off < s->cur_frame_end[i])
126 break;
127 }
128 }
129 }
130
132 uint8_t **poutbuf,
int *poutbuf_size,
134 int64_t
pts, int64_t dts, int64_t pos)
135 {
138
143 }
144
145 if (buf_size == 0) {
146 /* padding is always necessary even if EOF, so we add it here */
147 memset(dummy_buf, 0, sizeof(dummy_buf));
148 buf = dummy_buf;
150 /* add a new packet descriptor */
158 }
159
166 }
167 /* WARNING: the returned index can be negative */
169 poutbuf_size, buf, buf_size);
170 av_assert0(index > -0x20000000);
// The API does not allow returning AVERROR codes
171 /* update the file pointer */
172 if (*poutbuf_size) {
173 /* fill the data for the current frame */
175
176 /* offset of the next frame */
179 }
180 if (index < 0)
181 index = 0;
184 }
185
187 uint8_t **poutbuf,
int *poutbuf_size,
188 const uint8_t *
buf,
int buf_size,
int keyframe)
189 {
194 buf += i;
195 buf_size -= i;
196 }
197 }
198
199 /* cast to avoid warning about discarding qualifiers */
201 *poutbuf_size = buf_size;
205
206 *poutbuf_size =
size;
208 if (!*poutbuf)
210
214 return 1;
215 }
216 }
217
218 return 0;
219 }
220
222 {
223 if (s) {
228 }
229 }
230
233 {
235 ff_dlog(
NULL,
"overread %d, state:%X next:%d index:%d o_index:%d\n",
238 (*buf)[0], (*buf)[1], (*buf)[2], (*buf)[3]);
239 }
240
241 /* Copy overread bytes from last frame into buffer. */
244
245 /* flush remaining if EOF */
247 next = 0;
248
250
251 /* copy into buffer end return */
254 *buf_size + pc->
index +
256
257 if (!new_buffer) {
261 }
264 pc->
index += *buf_size;
265 return -1;
266 }
267
268 *buf_size =
270
271 /* append to buffer */
276 if (!new_buffer) {
281 }
288 }
289
290 /* store overread bytes */
291 for (; next < 0; next++) {
295 }
296
298 ff_dlog(
NULL,
"overread %d, state:%X next:%d index:%d o_index:%d\n",
301 (*buf)[0], (*buf)[1], (*buf)[2], (*buf)[3]);
302 }
303
304 return 0;
305 }
306
308 {
310
312 }
313
315 {
318
319 while (ptr < end) {
321 if (state == 0x1B3 || state == 0x1B6)
322 return ptr - 4 -
buf;
323 }
324
325 return 0;
326 }
int(* parser_init)(AVCodecParserContext *s)
memory handling functions
int64_t next_frame_offset
int64_t cur_frame_pos[AV_PARSER_PTS_NB]
Position of the packet in file.
int dts_ref_dts_delta
Offset of the current timestamp against last timestamp sync point in units of AVCodecContext.time_base.
int ff_mpeg4video_split(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
int av_parser_change(AVCodecParserContext *s, AVCodecContext *avctx, uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size, int keyframe)
#define CODEC_FLAG_GLOBAL_HEADER
Place global headers in extradata instead of every keyframe.
static av_cold int end(AVCodecContext *avctx)
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
struct AVCodecParser * next
int(* parser_parse)(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size)
const uint8_t * avpriv_find_start_code(const uint8_t *p, const uint8_t *end, uint32_t *state)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define avpriv_atomic_ptr_cas
int64_t pos
Byte position of currently parsed frame in stream.
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given block if it is not large enough, otherwise do nothing.
struct AVCodecParser * parser
int ff_combine_frame(ParseContext *pc, int next, const uint8_t **buf, int *buf_size)
Combine the (truncated) bitstream to a complete frame.
simple assert() macros that are a bit more flexible than ISO C assert().
int overread_index
the index into ParseContext.buffer of the overread bytes
int64_t cur_frame_dts[AV_PARSER_PTS_NB]
AVCodecParser * av_parser_next(const AVCodecParser *p)
void ff_parse_close(AVCodecParserContext *s)
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
int overread
the number of bytes which where irreversibly read from the next frame
int av_parser_parse2(AVCodecParserContext *s, AVCodecContext *avctx, uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size, int64_t pts, int64_t dts, int64_t pos)
Parse a packet.
void(* parser_close)(AVCodecParserContext *s)
int64_t offset
byte offset from starting packet start
int64_t convergence_duration
Time difference in stream time base units from the pts of this packet to the point at which the outpu...
void av_parser_close(AVCodecParserContext *s)
int64_t cur_frame_end[AV_PARSER_PTS_NB]
int64_t cur_frame_pts[AV_PARSER_PTS_NB]
int64_t last_pos
Previous frame byte position.
int pts_dts_delta
Presentation delay of current frame in units of AVCodecContext.time_base.
AVCodecParserContext * av_parser_init(int codec_id)
main external API structure.
#define CODEC_FLAG2_LOCAL_HEADER
Place global headers at every keyframe instead of in extradata.
int cur_frame_start_index
uint32_t state
contains the last few bytes in MSB order
uint64_t state64
contains the last 8 bytes in MSB order
void av_register_codec_parser(AVCodecParser *parser)
static AVCodecParser * av_first_parser
static int64_t pts
Global timestamp for the audio frames.
int(* split)(AVCodecContext *avctx, const uint8_t *buf, int buf_size)
common internal api header.
#define PARSER_FLAG_FETCHED_OFFSET
Set if the parser has a valid file offset.
int64_t cur_frame_offset[AV_PARSER_PTS_NB]
int format
The format of the coded data, corresponds to enum AVPixelFormat for video and for enum AVSampleFormat...
void ff_fetch_timestamp(AVCodecParserContext *s, int off, int remove, int fuzzy)
Fetch timestamps for a specific byte within the current access unit.
int key_frame
Set by parser to 1 for key frames and 0 for non-key frames.
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
int dts_sync_point
Synchronization point for start of timestamp generation.
#define AV_NOPTS_VALUE
Undefined timestamp value.