73 if (!duration || atof(duration->
value) < 0)
continue;
74 if (atof(duration->
value) > max) max = atof(duration->
value);
82 double min_buffer_time = 1.0;
83 avio_printf(s->
pb,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
85 avio_printf(s->
pb,
" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n");
86 avio_printf(s->
pb,
" xmlns=\"urn:mpeg:DASH:schema:MPD:2011\"\n");
87 avio_printf(s->
pb,
" xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011\"\n");
93 avio_printf(s->
pb,
" minBufferTime=\"PT%gS\"\n", min_buffer_time);
95 w->
is_live ?
"urn:mpeg:dash:profile:isoff-live:2011" :
"urn:webm:dash:profile:webm-on-demand:2012",
98 time_t local_time = time(
NULL);
100 struct tm *gmt =
gmtime_r(&local_time, &gmt_buffer);
102 if (!strftime(gmt_iso, 21,
"%Y-%m-%dT%H:%M:%SZ", gmt)) {
108 avio_printf(s->
pb,
" availabilityStartTime=\"%s\"\n", gmt_iso);
114 avio_printf(s->
pb,
" schemeIdUri=\"urn:mpeg:dash:utc:http-iso:2014\"\n");
134 if (!ts || strncmp(gold->
value, ts->
value, strlen(gold->
value)))
return 0;
144 if (!gold_track_num)
return 0;
150 strncmp(gold_track_num->
value, track_num->
value, strlen(gold_track_num->
value)) ||
165 int output_width,
int output_height,
166 int output_sample_rate) {
173 const char *bandwidth_str;
174 if ((w->
is_live && (!filename)) ||
175 (!w->
is_live && (!irange || !cues_start || !cues_end || !filename || !bandwidth))) {
180 if (w->
is_live && !bandwidth) {
183 bandwidth_str = bandwidth->
value;
244 int first_sample_rate,
i;
256 for (i = 0; i < w->
nb_as; i++) {
274 char **initialization_pattern,
char **media_pattern) {
275 char *underscore_pos =
NULL;
276 char *period_pos =
NULL;
277 char *filename_str =
av_strdup(filename);
284 underscore_pos = strrchr(filename_str,
'_');
285 if (!underscore_pos) {
289 period_pos = strchr(++underscore_pos,
'.');
294 *(underscore_pos - 1) = 0;
295 if (representation_id) {
296 *representation_id =
av_malloc(period_pos - underscore_pos + 1);
297 if (!(*representation_id)) {
301 av_strlcpy(*representation_id, underscore_pos, period_pos - underscore_pos + 1);
303 if (initialization_pattern) {
304 *initialization_pattern =
av_asprintf(
"%s_$RepresentationID$.hdr",
306 if (!(*initialization_pattern)) {
312 *media_pattern =
av_asprintf(
"%s_$RepresentationID$_$Number$.chk",
314 if (!(*media_pattern)) {
335 static const char boolean[2][6] = {
"false",
"true" };
336 int subsegmentStartsWithSAP = 1;
342 int width_in_as = 1, height_in_as = 1, sample_rate_in_as = 1;
373 if (!w->
is_live && (!kf || !strncmp(kf->
value,
"0", 1))) subsegmentStartsWithSAP = 0;
375 avio_printf(s->
pb,
" subsegmentStartsWithSAP=\"%d\"", subsegmentStartsWithSAP);
381 char *initialization_pattern =
NULL;
382 char *media_pattern =
NULL;
386 avio_printf(s->
pb,
"<ContentComponent id=\"1\" type=\"%s\"/>\n",
393 avio_printf(s->
pb,
" initialization=\"%s\"", initialization_pattern);
395 av_free(initialization_pattern);
400 char *representation_id =
NULL;
411 if (!representation_id)
return AVERROR(ENOMEM);
414 representation_id, !width_in_as,
415 !height_in_as, !sample_rate_in_as);
428 enum { new_set, parsed_id, parsing_streams }
state;
437 if (state == new_set)
441 }
else if (state == new_set && *p ==
' ') {
444 }
else if (state == new_set && !strncmp(p,
"id=", 3)) {
455 comma = strchr(p,
',');
456 if (!comma || comma - p >=
sizeof(w->
as[w->
nb_as - 1].
id)) {
460 while (*p !=
',') *q++ = *p++;
464 }
else if (state == parsed_id && !strncmp(p,
"streams=", 8)) {
466 state = parsing_streams;
467 }
else if (state == parsing_streams) {
474 num = strtoll(p, &q, 10);
475 if (!
av_isdigit(*p) || (*q !=
' ' && *q !=
'\0' && *q !=
',') ||
481 if (*q ==
'\0')
break;
482 if (*q ==
' ') state = new_set;
498 for (
unsigned i = 0; i < s->
nb_streams; i++) {
520 for (i = 0; i < w->
nb_as; i++) {
531 return ret < 0 ? ret : 0;
539 #define OFFSET(x) offsetof(WebMDashMuxContext, x) 541 {
"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 },
544 {
"chunk_duration_ms",
"duration of each chunk (in milliseconds)",
OFFSET(chunk_duration),
AV_OPT_TYPE_INT, {.i64 = 1000}, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
545 {
"utc_timing_url",
"URL of the page that will return the UTC timestamp in ISO format",
OFFSET(utc_timing_url),
AV_OPT_TYPE_STRING, { 0 }, 0, 0, AV_OPT_FLAG_ENCODING_PARAM },
546 {
"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 },
547 {
"minimum_update_period",
"Minimum Update Period (in seconds) of the manifest.",
OFFSET(minimum_update_period),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
559 .
name =
"webm_dash_manifest",
561 .mime_type =
"application/xml",
566 .priv_class = &webm_dash_class,
static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int unqueue)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
void * av_realloc(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory.
static av_const int av_isdigit(int c)
Locale-independent conversion of ASCII isdigit.
#define LIBAVUTIL_VERSION_INT
#define INITIALIZATION_RANGE
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
static int subsegment_alignment(AVFormatContext *s, AdaptationSet *as)
const char * av_default_item_name(void *ptr)
Return the context name.
This struct describes the properties of an encoded stream.
AVOutputFormat ff_webm_dash_manifest_muxer
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 av_cold int end(AVCodecContext *avctx)
AVStream ** streams
A list of all streams in the file.
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
int flags
Flags modifying the (de)muxer behaviour.
#define AVERROR_EOF
End of file.
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
#define i(width, name, range_min, range_max)
AVCodecID
Identify the syntax and semantics of the bitstream.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static const AVOption options[]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static int webm_dash_manifest_write_packet(AVFormatContext *s, AVPacket *pkt)
enum AVMediaType codec_type
General type of the encoded 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.
static int check_matching_sample_rate(AVFormatContext *s, AdaptationSet *as)
int extradata_size
Size of the extradata content in bytes.
static int webm_dash_manifest_write_header(AVFormatContext *s)
int av_reallocp_array(void *ptr, size_t nmemb, size_t size)
Allocate, reallocate, or free an array through a pointer to a pointer.
char * av_asprintf(const char *fmt,...)
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
static int write_header(AVFormatContext *s)
double time_shift_buffer_depth
static void write_footer(AVFormatContext *s)
static double get_duration(AVFormatContext *s)
static const char * get_codec_name(int codec_id)
char * av_strdup(const char *s)
Duplicate a string.
AVIOContext * pb
I/O context.
Describe the class of an AVClass context structure.
static int parse_filename(char *filename, char **representation_id, char **initialization_pattern, char **media_pattern)
static int check_matching_height(AVFormatContext *s, AdaptationSet *as)
const char * name
Name of the codec described by this descriptor.
static void free_adaptation_sets(AVFormatContext *s)
int sample_rate
Audio only.
#define AVERROR_UNKNOWN
Unknown error, typically from an external library.
void * priv_data
Format private data.
static const AVClass webm_dash_class
static int write_adaptation_set(AVFormatContext *s, int as_index)
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
uint8_t * extradata
Extra binary data needed for initializing the decoder, codec-dependent.
static int bitstream_switching(AVFormatContext *s, AdaptationSet *as)
AVCodecParameters * codecpar
Codec parameters associated with this stream.
static int parse_adaptation_sets(AVFormatContext *s)
static int check_matching_width(AVFormatContext *s, AdaptationSet *as)
This structure stores compressed data.
static int write_representation(AVFormatContext *s, AVStream *stream, char *id, int output_width, int output_height, int output_sample_rate)
int avio_printf(AVIOContext *s, const char *fmt,...) av_printf_format(2
Writes a formatted string to the context.
int minimum_update_period