FFmpeg
Loading...
Searching...
No Matches
demux_utils.c
Go to the documentation of this file.
1/*
2 * Various utility demuxing functions
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
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#include "libavutil/mem.h"
23
24#include "libavutil/avassert.h"
26#include "packet_internal.h"
27#include "avformat.h"
28#include "avformat_internal.h"
29#include "avio_internal.h"
30#include "demux.h"
31#include "internal.h"
32
34{
35 return cffstream(st)->parser;
36}
37
42
44 int64_t start, int64_t end, const char *title)
45{
47 AVChapter *chapter = NULL;
48 int ret;
49
50 if (end != AV_NOPTS_VALUE && start > end) {
51 av_log(s, AV_LOG_ERROR, "Chapter end time %"PRId64" before start %"PRId64"\n", end, start);
52 return NULL;
53 }
54
55 if (!s->nb_chapters) {
56 fci->chapter_ids_monotonic = 1;
57 } else if (!fci->chapter_ids_monotonic || s->chapters[s->nb_chapters-1]->id >= id) {
58 for (unsigned i = 0; i < s->nb_chapters; i++)
59 if (s->chapters[i]->id == id)
60 chapter = s->chapters[i];
61 if (!chapter)
62 fci->chapter_ids_monotonic = 0;
63 }
64
65 if (!chapter) {
66 chapter = av_mallocz(sizeof(*chapter));
67 if (!chapter)
68 return NULL;
69 ret = av_dynarray_add_nofree(&s->chapters, &s->nb_chapters, chapter);
70 if (ret < 0) {
71 av_free(chapter);
72 return NULL;
73 }
74 }
75 av_dict_set(&chapter->metadata, "title", title, 0);
76 chapter->id = id;
77 chapter->time_base = time_base;
78 chapter->start = start;
79 chapter->end = end;
80
81 return chapter;
82}
83
85{
87 int ret;
88 for (unsigned i = 0; i < s->nb_streams; i++)
89 if (s->streams[i]->disposition & AV_DISPOSITION_ATTACHED_PIC &&
90 s->streams[i]->discard < AVDISCARD_ALL) {
91 if (s->streams[i]->attached_pic.size <= 0) {
93 "Attached picture on stream %d has invalid size, "
94 "ignoring\n", i);
95 continue;
96 }
97
99 &s->streams[i]->attached_pic,
100 av_packet_ref, 0);
101 if (ret < 0)
102 return ret;
103 }
104 return 0;
105}
106
108 AVBufferRef **buf, int size)
109{
110 AVStream *st = st0;
111 AVPacket *pkt;
112 int ret;
113
114 if (!st && !(st = avformat_new_stream(s, NULL)))
115 return AVERROR(ENOMEM);
116 pkt = &st->attached_pic;
117 if (buf) {
118 av_assert1(*buf);
120 pkt->buf = *buf;
121 pkt->data = (*buf)->data;
122 pkt->size = (*buf)->size - AV_INPUT_BUFFER_PADDING_SIZE;
123 *buf = NULL;
124 } else {
125 ret = av_get_packet(pb, pkt, size);
126 if (ret < 0)
127 goto fail;
128 }
131
132 pkt->stream_index = st->index;
133 pkt->flags |= AV_PKT_FLAG_KEY;
134
135 return 0;
136fail:
137 if (!st0)
138 ff_remove_stream(s, st);
139 return ret;
140}
141
143 uint64_t channel_layout, int32_t sample_rate,
145{
146 uint32_t flags = 0;
147 int size = 4;
148 uint8_t *data;
149 if (!pkt)
150 return AVERROR(EINVAL);
151
152 if (sample_rate) {
153 size += 4;
155 }
156 if (width || height) {
157 size += 8;
159 }
161 if (!data)
162 return AVERROR(ENOMEM);
163 bytestream_put_le32(&data, flags);
164 if (sample_rate)
165 bytestream_put_le32(&data, sample_rate);
166 if (width || height) {
167 bytestream_put_le32(&data, width);
168 bytestream_put_le32(&data, height);
169 }
170 return 0;
171}
172
174{
175 if (ffifmt(s->iformat)->read_set_state)
176 return ffifmt(s->iformat)->read_set_state(s, FF_INFMT_STATE_PLAY);
177 if (s->pb)
178 return avio_pause(s->pb, 0);
179 return AVERROR(ENOSYS);
180}
181
183{
184 if (ffifmt(s->iformat)->read_set_state)
185 return ffifmt(s->iformat)->read_set_state(s, FF_INFMT_STATE_PAUSE);
186 if (s->pb)
187 return avio_pause(s->pb, 1);
188 return AVERROR(ENOSYS);
189}
190
192{
193 if (ffifmt(s->iformat)->handle_command)
194 return ffifmt(s->iformat)->handle_command(s, FF_INFMT_COMMAND_SUBMIT, id, data);
195 return AVERROR(ENOSYS);
196}
197
199{
200 if (ffifmt(s->iformat)->handle_command)
201 return ffifmt(s->iformat)->handle_command(s, FF_INFMT_COMMAND_GET_REPLY, id, data_out);
202 return AVERROR(ENOSYS);
203}
204
206{
207 static const uint8_t avci100_1080p_extradata[] = {
208 // SPS
209 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
210 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
211 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
212 0x18, 0x21, 0x02, 0x56, 0xb9, 0x3d, 0x7d, 0x7e,
213 0x4f, 0xe3, 0x3f, 0x11, 0xf1, 0x9e, 0x08, 0xb8,
214 0x8c, 0x54, 0x43, 0xc0, 0x78, 0x02, 0x27, 0xe2,
215 0x70, 0x1e, 0x30, 0x10, 0x10, 0x14, 0x00, 0x00,
216 0x03, 0x00, 0x04, 0x00, 0x00, 0x03, 0x00, 0xca,
217 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
218 // PPS
219 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
220 0xd0
221 };
222 static const uint8_t avci100_1080i_extradata[] = {
223 // SPS
224 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
225 0xb6, 0xd4, 0x20, 0x22, 0x33, 0x19, 0xc6, 0x63,
226 0x23, 0x21, 0x01, 0x11, 0x98, 0xce, 0x33, 0x19,
227 0x18, 0x21, 0x03, 0x3a, 0x46, 0x65, 0x6a, 0x65,
228 0x24, 0xad, 0xe9, 0x12, 0x32, 0x14, 0x1a, 0x26,
229 0x34, 0xad, 0xa4, 0x41, 0x82, 0x23, 0x01, 0x50,
230 0x2b, 0x1a, 0x24, 0x69, 0x48, 0x30, 0x40, 0x2e,
231 0x11, 0x12, 0x08, 0xc6, 0x8c, 0x04, 0x41, 0x28,
232 0x4c, 0x34, 0xf0, 0x1e, 0x01, 0x13, 0xf2, 0xe0,
233 0x3c, 0x60, 0x20, 0x20, 0x28, 0x00, 0x00, 0x03,
234 0x00, 0x08, 0x00, 0x00, 0x03, 0x01, 0x94, 0x20,
235 // PPS
236 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x33, 0x48,
237 0xd0
238 };
239 static const uint8_t avci50_1080p_extradata[] = {
240 // SPS
241 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
242 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
243 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
244 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
245 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
246 0x6e, 0x6c, 0xd3, 0x3c, 0x05, 0xa0, 0x22, 0x7e,
247 0x5f, 0xfc, 0x00, 0x0c, 0x00, 0x13, 0x8c, 0x04,
248 0x04, 0x05, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00,
249 0x00, 0x03, 0x00, 0x32, 0x84, 0x00, 0x00, 0x00,
250 // PPS
251 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
252 0x11
253 };
254 static const uint8_t avci50_1080i_extradata[] = {
255 // SPS
256 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x28,
257 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
258 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
259 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6e, 0x61,
260 0x87, 0x3e, 0x73, 0x4d, 0x98, 0x0c, 0x03, 0x06,
261 0x9c, 0x0b, 0x73, 0xe6, 0xc0, 0xb5, 0x18, 0x63,
262 0x0d, 0x39, 0xe0, 0x5b, 0x02, 0xd4, 0xc6, 0x19,
263 0x1a, 0x79, 0x8c, 0x32, 0x34, 0x24, 0xf0, 0x16,
264 0x81, 0x13, 0xf7, 0xff, 0x80, 0x02, 0x00, 0x01,
265 0xf1, 0x80, 0x80, 0x80, 0xa0, 0x00, 0x00, 0x03,
266 0x00, 0x20, 0x00, 0x00, 0x06, 0x50, 0x80, 0x00,
267 // PPS
268 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
269 0x11
270 };
271 static const uint8_t avci100_720p_extradata[] = {
272 // SPS
273 0x00, 0x00, 0x00, 0x01, 0x67, 0x7a, 0x10, 0x29,
274 0xb6, 0xd4, 0x20, 0x2a, 0x33, 0x1d, 0xc7, 0x62,
275 0xa1, 0x08, 0x40, 0x54, 0x66, 0x3b, 0x8e, 0xc5,
276 0x42, 0x02, 0x10, 0x25, 0x64, 0x2c, 0x89, 0xe8,
277 0x85, 0xe4, 0x21, 0x4b, 0x90, 0x83, 0x06, 0x95,
278 0xd1, 0x06, 0x46, 0x97, 0x20, 0xc8, 0xd7, 0x43,
279 0x08, 0x11, 0xc2, 0x1e, 0x4c, 0x91, 0x0f, 0x01,
280 0x40, 0x16, 0xec, 0x07, 0x8c, 0x04, 0x04, 0x05,
281 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x03,
282 0x00, 0x64, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
283 // PPS
284 0x00, 0x00, 0x00, 0x01, 0x68, 0xce, 0x31, 0x12,
285 0x11
286 };
287 static const uint8_t avci50_720p_extradata[] = {
288 // SPS
289 0x00, 0x00, 0x00, 0x01, 0x67, 0x6e, 0x10, 0x20,
290 0xa6, 0xd4, 0x20, 0x32, 0x33, 0x0c, 0x71, 0x18,
291 0x88, 0x62, 0x10, 0x19, 0x19, 0x86, 0x38, 0x8c,
292 0x44, 0x30, 0x21, 0x02, 0x56, 0x4e, 0x6f, 0x37,
293 0xcd, 0xf9, 0xbf, 0x81, 0x6b, 0xf3, 0x7c, 0xde,
294 0x6e, 0x6c, 0xd3, 0x3c, 0x0f, 0x01, 0x6e, 0xff,
295 0xc0, 0x00, 0xc0, 0x01, 0x38, 0xc0, 0x40, 0x40,
296 0x50, 0x00, 0x00, 0x03, 0x00, 0x10, 0x00, 0x00,
297 0x06, 0x48, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
298 // PPS
299 0x00, 0x00, 0x00, 0x01, 0x68, 0xee, 0x31, 0x12,
300 0x11
301 };
302
303 const uint8_t *data = NULL;
304 int ret, size = 0;
305
306 if (st->codecpar->width == 1920) {
308 data = avci100_1080p_extradata;
309 size = sizeof(avci100_1080p_extradata);
310 } else {
311 data = avci100_1080i_extradata;
312 size = sizeof(avci100_1080i_extradata);
313 }
314 } else if (st->codecpar->width == 1440) {
316 data = avci50_1080p_extradata;
317 size = sizeof(avci50_1080p_extradata);
318 } else {
319 data = avci50_1080i_extradata;
320 size = sizeof(avci50_1080i_extradata);
321 }
322 } else if (st->codecpar->width == 1280) {
323 data = avci100_720p_extradata;
324 size = sizeof(avci100_720p_extradata);
325 } else if (st->codecpar->width == 960) {
326 data = avci50_720p_extradata;
327 size = sizeof(avci50_720p_extradata);
328 }
329
330 if (!size)
331 return 0;
332
333 if ((ret = ff_alloc_extradata(st->codecpar, size)) < 0)
334 return ret;
335 memcpy(st->codecpar->extradata, data, size);
336
337 return 0;
338}
339
340int ff_get_extradata(void *logctx, AVCodecParameters *par, AVIOContext *pb, int size)
341{
342 int ret = ff_alloc_extradata(par, size);
343 if (ret < 0)
344 return ret;
345 ret = ffio_read_size(pb, par->extradata, size);
346 if (ret < 0) {
347 av_freep(&par->extradata);
348 par->extradata_size = 0;
349 av_log(logctx, AV_LOG_ERROR, "Failed to read extradata of size %d\n", size);
350 return ret;
351 }
352
353 return ret;
354}
355
357{
358 for (unsigned i = 0; i < s->nb_streams; i++)
359 if (s->streams[i]->id == id)
360 return i;
361 return -1;
362}
channels
Definition aptx.h:31
int32_t
simple assert() macros that are a bit more flexible than ISO C assert().
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition avassert.h:58
void ff_remove_stream(AVFormatContext *s, AVStream *st)
Remove a stream from its AVFormatContext and free it.
Definition avformat.c:122
Main libavformat public API header.
int av_get_packet(AVIOContext *s, AVPacket *pkt, int size)
Allocate and read the payload of a packet and initialize its fields with default values.
Definition utils.c:98
#define AV_DISPOSITION_ATTACHED_PIC
The stream is stored in the file as an attached picture/"cover art" (e.g.
Definition avformat.h:692
AVStreamParseType
Definition avformat.h:609
static av_always_inline FormatContextInternal * ff_fc_internal(AVFormatContext *s)
int avio_pause(AVIOContext *h, int pause)
Pause and resume playing - only meaningful if using a network streaming protocol (e....
Definition aviobuf.c:1228
int ffio_read_size(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition aviobuf.c:665
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
@ AV_FIELD_PROGRESSIVE
Definition defs.h:213
@ FF_INFMT_STATE_PLAY
Definition demux.h:52
@ FF_INFMT_STATE_PAUSE
Definition demux.h:53
@ FF_INFMT_COMMAND_GET_REPLY
Definition demux.h:63
@ FF_INFMT_COMMAND_SUBMIT
Definition demux.h:62
static const FFInputFormat * ffifmt(const AVInputFormat *fmt)
Definition demux.h:186
static AVPacket * pkt
AVChapter * avpriv_new_chapter(AVFormatContext *s, int64_t id, AVRational time_base, int64_t start, int64_t end, const char *title)
Add a new chapter.
Definition demux_utils.c:43
struct AVCodecParserContext * av_stream_get_parser(const AVStream *st)
Definition demux_utils.c:33
int ff_add_attached_pic(AVFormatContext *s, AVStream *st0, AVIOContext *pb, AVBufferRef **buf, int size)
Add an attached pic to an AVStream.
int ff_generate_avci_extradata(AVStream *st)
Generate standard extradata for AVC-Intra based on width/height and field order.
int ff_find_stream_index(const AVFormatContext *s, int id)
Find stream index based on format-specific stream ID.
void avpriv_stream_set_need_parsing(AVStream *st, enum AVStreamParseType type)
Definition demux_utils.c:38
int ff_add_param_change(AVPacket *pkt, int32_t channels, uint64_t channel_layout, int32_t sample_rate, int32_t width, int32_t height)
Add side data to a packet for changing parameters to the given values.
int ff_get_extradata(void *logctx, AVCodecParameters *par, AVIOContext *pb, int size)
Allocate extradata with additional AV_INPUT_BUFFER_PADDING_SIZE at end which is always set to 0 and f...
enum AVCodecID id
Definition dts2pts.c:607
#define fail
Definition test.h:479
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding.
Definition defs.h:40
@ AVDISCARD_ALL
discard all
Definition defs.h:232
@ AV_PKT_DATA_PARAM_CHANGE
An AV_PKT_DATA_PARAM_CHANGE side data packet is laid out as follows:
Definition packet.h:69
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition packet.c:434
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, size_t size)
Allocate new information of a packet.
Definition packet.c:231
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition packet.h:650
int av_packet_ref(AVPacket *dst, const AVPacket *src)
Setup a new reference to the data described by a given packet.
Definition packet.c:442
@ AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE
Definition packet.h:672
@ AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS
Definition packet.h:673
AVStream * avformat_new_stream(AVFormatContext *s, const struct AVCodec *c)
Add a new stream to a media file.
int av_read_pause(AVFormatContext *s)
Pause a network-based stream (e.g.
AVFormatCommandID
Command IDs that can be sent to the demuxer.
Definition avformat.h:2518
int av_read_play(AVFormatContext *s)
Start playing a network-based stream (e.g.
int avformat_receive_command_reply(AVFormatContext *s, enum AVFormatCommandID id, void **data_out)
Receive a command reply from the demuxer.
int avformat_send_command(AVFormatContext *s, enum AVFormatCommandID id, void *data)
Send a command to the demuxer.
int avformat_queue_attached_pictures(AVFormatContext *s)
Definition demux_utils.c:84
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition dict.c:86
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem)
Add an element to a dynamic array.
Definition mem.c:313
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition avutil.h:247
cl_device_type type
static av_always_inline FFStream * ffstream(AVStream *st)
Definition internal.h:365
static av_always_inline const FFStream * cffstream(const AVStream *st)
Definition internal.h:370
int ff_alloc_extradata(AVCodecParameters *par, int size)
Allocate extradata with additional AV_INPUT_BUFFER_PADDING_SIZE at end which is always set to 0.
Definition utils.c:237
int ff_packet_list_put(PacketList *list, AVPacket *pkt, int(*copy)(AVPacket *dst, const AVPacket *src), int flags)
Append an AVPacket to the list.
Definition packet_list.c:40
Memory handling functions.
const char data[16]
Definition mxf.c:149
A reference to a data buffer.
Definition buffer.h:82
int64_t id
unique ID to identify the chapter
Definition avformat.h:1293
int64_t start
Definition avformat.h:1295
AVDictionary * metadata
Definition avformat.h:1296
int64_t end
chapter start/end time in time_base units
Definition avformat.h:1295
AVRational time_base
time base in which the start/end timestamps are specified
Definition avformat.h:1294
This struct describes the properties of an encoded stream.
Definition codec_par.h:49
int extradata_size
Size of the extradata content in bytes.
Definition codec_par.h:75
enum AVFieldOrder field_order
The order of the fields in interlaced video.
Definition codec_par.h:182
int width
The width of the video frame in pixels.
Definition codec_par.h:143
enum AVMediaType codec_type
General type of the encoded data.
Definition codec_par.h:53
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Definition codec_par.h:71
Format I/O context.
Definition avformat.h:1333
Bytestream IO Context.
Definition avio.h:160
This structure stores compressed data.
Definition packet.h:580
Rational number (pair of numerator and denominator).
Definition rational.h:58
Stream structure.
Definition avformat.h:766
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition avformat.h:789
int index
stream index in AVFormatContext
Definition avformat.h:772
AVPacket attached_pic
For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet will contain the attached pictu...
Definition avformat.h:864
int disposition
Stream disposition - a combination of AV_DISPOSITION_* flags.
Definition avformat.h:835
int(* read_set_state)(struct AVFormatContext *, enum FFInputFormatStreamState state)
Change the stream state - only meaningful if using a network-based format (RTSP).
Definition demux.h:139
int(* handle_command)(struct AVFormatContext *, enum FFInputFormatCommandOption opt, enum AVFormatCommandID id, void *data)
Handle demuxer commands This callback is used to either send a command to a demuxer (FF_INFMT_COMMAND...
Definition demux.h:167
struct AVCodecParserContext * parser
Definition internal.h:322
enum AVStreamParseType need_parsing
Definition internal.h:321
PacketList raw_packet_buffer
Raw packets from the demuxer, prior to parsing and decoding.
int chapter_ids_monotonic
Set if chapter ids are strictly monotonic.
#define av_free(p)
#define av_mallocz(s)
#define av_freep(p)
#define av_log(a,...)
#define height
Definition dsp.h:89
#define width
Definition dsp.h:89
int size