Go to the documentation of this file.
82 for (
i = 0;
i <
s->nb_streams;
i++) {
94 double min_buffer_time = 1.0;
95 avio_printf(
s->pb,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
97 avio_printf(
s->pb,
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");
98 avio_printf(
s->pb,
" xmlns=\"urn:mpeg:DASH:schema:MPD:2011\"\n");
99 avio_printf(
s->pb,
" xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011\"\n");
100 avio_printf(
s->pb,
" type=\"%s\"\n",
w->is_live ?
"dynamic" :
"static");
102 avio_printf(
s->pb,
" mediaPresentationDuration=\"PT%gS\"\n",
105 avio_printf(
s->pb,
" minBufferTime=\"PT%gS\"\n", min_buffer_time);
107 w->is_live ?
"urn:mpeg:dash:profile:isoff-live:2011" :
"urn:mpeg:dash:profile:webm-on-demand:2012",
108 w->is_live ?
"\n" :
">\n");
110 time_t local_time = time(
NULL);
111 struct tm gmt_buffer;
112 struct tm *gmt =
gmtime_r(&local_time, &gmt_buffer);
114 if (!strftime(gmt_iso, 21,
"%Y-%m-%dT%H:%M:%SZ", gmt)) {
120 avio_printf(
s->pb,
" availabilityStartTime=\"%s\"\n", gmt_iso);
121 avio_printf(
s->pb,
" timeShiftBufferDepth=\"PT%gS\"\n",
w->time_shift_buffer_depth);
122 avio_printf(
s->pb,
" minimumUpdatePeriod=\"PT%dS\"",
w->minimum_update_period);
124 if (
w->utc_timing_url) {
126 avio_printf(
s->pb,
" schemeIdUri=\"urn:mpeg:dash:utc:http-iso:2014\"\n");
146 if (!ts || strncmp(gold->
value, ts->
value, strlen(gold->
value)))
return 0;
156 if (!gold_track_num)
return 0;
162 strncmp(gold_track_num->
value, track_num->
value, strlen(gold_track_num->
value)) ||
177 int output_width,
int output_height,
178 int output_sample_rate) {
185 const char *bandwidth_str;
186 if ((
w->is_live && (!filename)) ||
187 (!
w->is_live && (!irange || !cues_start || !cues_end || !filename || !bandwidth))) {
192 if (
w->is_live && !bandwidth) {
195 bandwidth_str = bandwidth->
value;
232 first_width =
s->streams[as->
streams[0]]->codecpar->width;
234 if (first_width !=
s->streams[as->
streams[
i]]->codecpar->width)
245 first_height =
s->streams[as->
streams[0]]->codecpar->height;
247 if (first_height !=
s->streams[as->
streams[
i]]->codecpar->height)
256 int first_sample_rate,
i;
258 first_sample_rate =
s->streams[as->
streams[0]]->codecpar->sample_rate;
260 if (first_sample_rate !=
s->streams[as->
streams[
i]]->codecpar->sample_rate)
268 for (
i = 0;
i <
w->nb_as;
i++) {
286 char **initialization_pattern,
char **media_pattern) {
287 char *underscore_pos =
NULL;
288 char *period_pos =
NULL;
289 char *temp_pos =
NULL;
290 char *filename_str =
av_strdup(filename);
299 underscore_pos = temp_pos + 1;
302 if (!underscore_pos) {
311 *(underscore_pos - 1) = 0;
312 if (representation_id) {
313 *representation_id =
av_malloc(period_pos - underscore_pos + 1);
314 if (!(*representation_id)) {
318 av_strlcpy(*representation_id, underscore_pos, period_pos - underscore_pos + 1);
320 if (initialization_pattern) {
321 *initialization_pattern =
av_asprintf(
"%s_$RepresentationID$.hdr",
323 if (!(*initialization_pattern)) {
329 *media_pattern =
av_asprintf(
"%s_$RepresentationID$_$Number$.chk",
331 if (!(*media_pattern)) {
352 static const char boolean[2][6] = {
"false",
"true" };
353 int subsegmentStartsWithSAP = 1;
359 int width_in_as = 1, height_in_as = 1, sample_rate_in_as = 1;
390 if (!
w->is_live && (!kf || !strncmp(kf->
value,
"0", 1))) subsegmentStartsWithSAP = 0;
392 avio_printf(
s->pb,
" subsegmentStartsWithSAP=\"%d\"", subsegmentStartsWithSAP);
398 char *initialization_pattern =
NULL;
399 char *media_pattern =
NULL;
403 avio_printf(
s->pb,
"<ContentComponent id=\"1\" type=\"%s\"/>\n",
409 avio_printf(
s->pb,
" startNumber=\"%d\"",
w->chunk_start_index);
410 avio_printf(
s->pb,
" initialization=\"%s\"", initialization_pattern);
412 av_free(initialization_pattern);
417 char *representation_id =
NULL;
427 representation_id =
av_asprintf(
"%d",
w->representation_id++);
428 if (!representation_id)
return AVERROR(ENOMEM);
431 representation_id, !width_in_as,
432 !height_in_as, !sample_rate_in_as);
455 char *p =
w->adaptation_sets;
457 enum { new_set, parsed_id, parsing_streams }
state;
458 if (!
w->adaptation_sets) {
464 while (p < w->adaptation_sets + strlen(
w->adaptation_sets)) {
467 else if (
state == new_set && !strncmp(p,
"id=", 3)) {
474 w->as[
w->nb_as - 1].nb_streams = 0;
475 w->as[
w->nb_as - 1].streams =
NULL;
477 q =
w->as[
w->nb_as - 1].id;
478 comma = strchr(p,
',');
479 if (!comma || comma - p >=
sizeof(
w->as[
w->nb_as - 1].id)) {
483 while (*p !=
',') *q++ = *p++;
487 }
else if (
state == parsed_id && !strncmp(p,
"streams=", 8)) {
489 state = parsing_streams;
490 }
else if (
state == parsing_streams) {
497 while (*q !=
'\0' && *q !=
',' && *q !=
' ') q++;
504 if (*q ==
'\0')
break;
505 if (*q ==
' ')
state = new_set;
521 for (
unsigned i = 0;
i <
s->nb_streams;
i++) {
543 for (
i = 0;
i <
w->nb_as;
i++) {
568 #define OFFSET(x) offsetof(WebMDashMuxContext, x)
570 {
"adaptation_sets",
"Adaptation sets. Syntax: id=0,streams=0,1,2 id=1,streams=3,4 and so on",
OFFSET(adaptation_sets),
AV_OPT_TYPE_STRING, { 0 }, 0, 0,
AV_OPT_FLAG_ENCODING_PARAM },
576 {
"time_shift_buffer_depth",
"Smallest time (in seconds) shifting buffer for which any Representation is guaranteed to be available.",
OFFSET(time_shift_buffer_depth),
AV_OPT_TYPE_DOUBLE, { .dbl = 60.0 }, 1.0, DBL_MAX,
AV_OPT_FLAG_ENCODING_PARAM },
581 #if CONFIG_WEBM_DASH_MANIFEST_MUXER
590 .
name =
"webm_dash_manifest",
592 .mime_type =
"application/xml",
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
enum AVMediaType codec_type
General type of the encoded data.
This struct describes the properties of an encoded stream.
char * av_stristr(const char *s1, const char *s2)
Locate the first case-independent occurrence in the string haystack of the string needle.
#define AVERROR_EOF
End of file.
static int write_representation(AVFormatContext *s, AVStream *stream, char *id, int output_width, int output_height, int output_sample_rate)
static void free_adaptation_sets(AVFormatContext *s)
char * av_asprintf(const char *fmt,...)
static int check_matching_width(AVFormatContext *s, AdaptationSet *as)
static av_cold int end(AVCodecContext *avctx)
static void write_footer(AVFormatContext *s)
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
static const AVClass webm_dash_class
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
static int webm_dash_manifest_write_packet(AVFormatContext *s, AVPacket *pkt)
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
static double get_duration(AVFormatContext *s)
static int write_header(AVFormatContext *s)
static const char * get_codec_name(int codec_id)
static int parse_adaptation_sets(AVFormatContext *s)
AVCodecParameters * codecpar
Codec parameters associated with this stream.
#define LIBAVUTIL_VERSION_INT
Describe the class of an AVClass context structure.
static int subsegment_alignment(AVFormatContext *s, AdaptationSet *as)
static int write_trailer(AVFormatContext *s1)
const char * av_default_item_name(void *ptr)
Return the context name.
int sample_rate
Audio only.
static int webm_dash_manifest_write_header(AVFormatContext *s)
AVCodecID
Identify the syntax and semantics of the bitstream.
int extradata_size
Size of the extradata content in bytes.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static int webm_dash_manifest_write_trailer(AVFormatContext *s)
#define INITIALIZATION_RANGE
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate, or free an array through a pointer to a pointer.
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int unqueue)
#define i(width, name, range_min, range_max)
static int write_adaptation_set(AVFormatContext *s, int as_index)
static int parse_filename(char *filename, char **representation_id, char **initialization_pattern, char **media_pattern)
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
static const AVOption options[]
int minimum_update_period
int avio_printf(AVIOContext *s, const char *fmt,...) av_printf_format(2
double time_shift_buffer_depth
static int bitstream_switching(AVFormatContext *s, AdaptationSet *as)
static int check_matching_sample_rate(AVFormatContext *s, AdaptationSet *as)
char * av_strdup(const char *s)
Duplicate a string.
static int check_matching_height(AVFormatContext *s, AdaptationSet *as)
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
This structure stores compressed data.
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static int to_integer(char *p, int len)