22 #include <libxml/parser.h>
31 #define INITIAL_BUFFER_SIZE 32768
166 ret = sscanf(datetime,
"%d-%d-%dT%d:%d:%fZ", &year, &month, &day, &hour, &minute, &second);
171 timeinfo.tm_year = year - 1900;
172 timeinfo.tm_mon = month - 1;
173 timeinfo.tm_mday = day;
174 timeinfo.tm_hour = hour;
175 timeinfo.tm_min = minute;
176 timeinfo.tm_sec = (
int)second;
194 if (*ptr ==
'P' || *ptr ==
'T') {
199 if (sscanf(ptr,
"%f%c%n", &value, &type, &size) != 2) {
205 days = (uint32_t)value;
208 hours = (uint32_t)value;
211 mins = (uint32_t)value;
214 secs = (uint32_t)value;
222 return ((days * 24 + hours) * 60 + mins) * 60 + secs;
237 if (num == cur_seq_no)
243 if (num == cur_seq_no)
265 if (start_time > cur_time)
271 if (start_time > cur_time)
357 const char *proto_name =
NULL;
364 if (url[6] ==
'+' || url[6] ==
':')
378 "Filename extension of \'%s\' is not a common multimedia extension, blocked for security reasons.\n"
379 "If you wish to override this adjust allowed_extensions, you can set it to \'ALL\' to allow all\n",
388 if (!strncmp(proto_name, url, strlen(proto_name)) && url[strlen(proto_name)] ==
':')
390 else if (
av_strstart(url,
"crypto",
NULL) && !strncmp(proto_name, url + 7, strlen(proto_name)) && url[7 + strlen(proto_name)] ==
':')
392 else if (strcmp(proto_name,
"file") || !strncmp(url,
"file,", 5))
398 char *new_cookies =
NULL;
422 char *rep_bandwidth_val,
431 memset(tmp_str, 0,
sizeof(tmp_str));
433 for (i = 0; i < n_baseurl_nodes; ++i) {
434 if (baseurl_nodes[i] &&
435 baseurl_nodes[i]->children &&
436 baseurl_nodes[i]->children->type == XML_TEXT_NODE) {
437 text = xmlNodeGetContent(baseurl_nodes[i]->children);
439 memset(tmp_str, 0,
sizeof(tmp_str));
440 memset(tmp_str_2, 0,
sizeof(tmp_str_2));
442 av_strlcpy(tmp_str, tmp_str_2,
sizeof(tmp_str));
449 av_strlcat(tmp_str, (
const char*)val,
sizeof(tmp_str));
452 url =
av_strireplace(tmp_str,
"$RepresentationID$", (
const char*)rep_id_val);
459 if (rep_bandwidth_val && tmp_str[0] !=
'\0') {
460 url =
av_strireplace(tmp_str,
"$Bandwidth$", (
const char*)rep_bandwidth_val);
473 for (i = 0; i < n_nodes; ++i) {
475 val = xmlGetProp(nodes[i], attrname);
486 xmlNodePtr node = rootnode;
491 node = xmlFirstElementChild(node);
496 node = xmlNextElementSibling(node);
509 for (i = 0; i < 2; i++) {
510 attr = i ?
"mimeType" :
"contentType";
511 val = xmlGetProp(node, attr);
515 }
else if (
av_stristr((
const char *)val,
"audio")) {
526 xmlNodePtr fragmenturl_node,
527 xmlNodePtr *baseurl_nodes,
529 char *rep_bandwidth_val)
531 char *initialization_val =
NULL;
532 char *media_val =
NULL;
534 if (!
av_strcasecmp(fragmenturl_node->name, (
const char *)
"Initialization")) {
535 initialization_val = xmlGetProp(fragmenturl_node,
"sourceURL");
536 if (initialization_val) {
539 xmlFree(initialization_val);
548 xmlFree(initialization_val);
552 xmlFree(initialization_val);
554 }
else if (!
av_strcasecmp(fragmenturl_node->name, (
const char *)
"SegmentURL")) {
555 media_val = xmlGetProp(fragmenturl_node,
"media");
581 xmlNodePtr fragment_timeline_node)
583 xmlAttrPtr attr =
NULL;
586 if (!
av_strcasecmp(fragment_timeline_node->name, (
const char *)
"S")) {
591 attr = fragment_timeline_node->properties;
593 val = xmlGetProp(fragment_timeline_node, attr->name);
596 av_log(s,
AV_LOG_WARNING,
"parse_manifest_segmenttimeline attr->name = %s val is NULL\n", attr->name);
603 tml->
repeat =(int64_t) strtoll(val,
NULL, 10);
618 xmlNodePtr adaptionset_node,
619 xmlNodePtr mpd_baseurl_node,
620 xmlNodePtr period_baseurl_node,
621 xmlNodePtr fragment_template_node,
622 xmlNodePtr content_component_node,
623 xmlNodePtr adaptionset_baseurl_node)
631 xmlNodePtr representation_segmenttemplate_node =
NULL;
632 xmlNodePtr representation_baseurl_node =
NULL;
633 xmlNodePtr representation_segmentlist_node =
NULL;
634 xmlNodePtr fragment_timeline_node =
NULL;
635 xmlNodePtr fragment_templates_tab[2];
636 char *duration_val =
NULL;
637 char *presentation_timeoffset_val =
NULL;
638 char *startnumber_val =
NULL;
639 char *timescale_val =
NULL;
640 char *initialization_val =
NULL;
641 char *media_val =
NULL;
642 xmlNodePtr baseurl_nodes[4];
643 xmlNodePtr representation_node = node;
644 char *rep_id_val = xmlGetProp(representation_node,
"id");
645 char *rep_bandwidth_val = xmlGetProp(representation_node,
"bandwidth");
670 baseurl_nodes[0] = mpd_baseurl_node;
671 baseurl_nodes[1] = period_baseurl_node;
672 baseurl_nodes[2] = adaptionset_baseurl_node;
673 baseurl_nodes[3] = representation_baseurl_node;
675 if (representation_segmenttemplate_node || fragment_template_node) {
676 fragment_timeline_node =
NULL;
677 fragment_templates_tab[0] = representation_segmenttemplate_node;
678 fragment_templates_tab[1] = fragment_template_node;
680 presentation_timeoffset_val =
get_val_from_nodes_tab(fragment_templates_tab, 2,
"presentationTimeOffset");
687 if (initialization_val) {
702 xmlFree(initialization_val);
710 if (presentation_timeoffset_val) {
712 xmlFree(presentation_timeoffset_val);
716 xmlFree(duration_val);
720 xmlFree(timescale_val);
722 if (startnumber_val) {
724 xmlFree(startnumber_val);
729 if (!fragment_timeline_node)
731 if (fragment_timeline_node) {
732 fragment_timeline_node = xmlFirstElementChild(fragment_timeline_node);
733 while (fragment_timeline_node) {
738 fragment_timeline_node = xmlNextElementSibling(fragment_timeline_node);
741 }
else if (representation_baseurl_node && !representation_segmentlist_node) {
755 }
else if (representation_segmentlist_node) {
758 xmlNodePtr fragmenturl_node =
NULL;
759 duration_val = xmlGetProp(representation_segmentlist_node,
"duration");
760 timescale_val = xmlGetProp(representation_segmentlist_node,
"timescale");
763 xmlFree(duration_val);
767 xmlFree(timescale_val);
769 fragmenturl_node = xmlFirstElementChild(representation_segmentlist_node);
770 while (fragmenturl_node) {
778 fragmenturl_node = xmlNextElementSibling(fragmenturl_node);
783 if (!fragment_timeline_node)
785 if (fragment_timeline_node) {
786 fragment_timeline_node = xmlFirstElementChild(fragment_timeline_node);
787 while (fragment_timeline_node) {
792 fragment_timeline_node = xmlNextElementSibling(fragment_timeline_node);
798 av_log(s,
AV_LOG_ERROR,
"Unknown format of Representation node id[%s] \n", (
const char *)rep_id_val);
820 if (rep_bandwidth_val)
821 xmlFree(rep_bandwidth_val);
827 xmlNodePtr adaptionset_node,
828 xmlNodePtr mpd_baseurl_node,
829 xmlNodePtr period_baseurl_node)
832 xmlNodePtr fragment_template_node =
NULL;
833 xmlNodePtr content_component_node =
NULL;
834 xmlNodePtr adaptionset_baseurl_node =
NULL;
835 xmlNodePtr node =
NULL;
837 node = xmlFirstElementChild(adaptionset_node);
839 if (!
av_strcasecmp(node->name, (
const char *)
"SegmentTemplate")) {
840 fragment_template_node = node;
841 }
else if (!
av_strcasecmp(node->name, (
const char *)
"ContentComponent")) {
842 content_component_node = node;
843 }
else if (!
av_strcasecmp(node->name, (
const char *)
"BaseURL")) {
844 adaptionset_baseurl_node = node;
845 }
else if (!
av_strcasecmp(node->name, (
const char *)
"Representation")) {
850 fragment_template_node,
851 content_component_node,
852 adaptionset_baseurl_node);
857 node = xmlNextElementSibling(node);
868 int64_t filesize = 0;
872 xmlNodePtr root_element =
NULL;
873 xmlNodePtr node =
NULL;
874 xmlNodePtr period_node =
NULL;
875 xmlNodePtr mpd_baseurl_node =
NULL;
876 xmlNodePtr period_baseurl_node =
NULL;
877 xmlNodePtr adaptionset_node =
NULL;
878 xmlAttrPtr attr =
NULL;
880 uint32_t perdiod_duration_sec = 0;
881 uint32_t perdiod_start_sec = 0;
912 filesize =
avio_read(in, buffer, filesize);
919 doc = xmlReadMemory(buffer, filesize, c->
base_url,
NULL, 0);
920 root_element = xmlDocGetRootElement(doc);
929 if (node->type != XML_ELEMENT_NODE ||
932 av_log(s,
AV_LOG_ERROR,
"Unable to parse '%s' - wrong root node name[%s] type[%d]\n", url, node->name, (
int)node->type);
936 val = xmlGetProp(node,
"type");
946 attr = node->properties;
948 val = xmlGetProp(node, attr->name);
950 if (!
av_strcasecmp(attr->name, (
const char *)
"availabilityStartTime")) {
952 }
else if (!
av_strcasecmp(attr->name, (
const char *)
"publishTime")) {
954 }
else if (!
av_strcasecmp(attr->name, (
const char *)
"minimumUpdatePeriod")) {
956 }
else if (!
av_strcasecmp(attr->name, (
const char *)
"timeShiftBufferDepth")) {
958 }
else if (!
av_strcasecmp(attr->name, (
const char *)
"minBufferTime")) {
960 }
else if (!
av_strcasecmp(attr->name, (
const char *)
"suggestedPresentationDelay")) {
962 }
else if (!
av_strcasecmp(attr->name, (
const char *)
"mediaPresentationDuration")) {
972 node = xmlFirstElementChild(node);
975 perdiod_duration_sec = 0;
976 perdiod_start_sec = 0;
977 attr = node->properties;
979 val = xmlGetProp(node, attr->name);
982 }
else if (!
av_strcasecmp(attr->name, (
const char *)
"start")) {
996 node = xmlNextElementSibling(node);
1004 adaptionset_node = xmlFirstElementChild(period_node);
1005 while (adaptionset_node) {
1006 if (!
av_strcasecmp(adaptionset_node->name, (
const char *)
"BaseURL")) {
1007 period_baseurl_node = adaptionset_node;
1008 }
else if (!
av_strcasecmp(adaptionset_node->name, (
const char *)
"AdaptationSet")) {
1011 adaptionset_node = xmlNextElementSibling(adaptionset_node);
1039 int64_t start_time_offset = 0;
1046 if (start_time_offset < 60 * pls->fragment_timescale)
1047 start_time_offset = 0;
1106 if (rep_dest && rep_src ) {
1120 if (rep_dest && rep_src ) {
1156 int64_t currentVideoTime = 0;
1157 int64_t currentAudioTime = 0;
1163 if (cur_video && cur_video->
timelines) {
1169 if (cur_audio && cur_audio->
timelines) {
1176 if (cur_video && cur_video->
fragments) {
1179 if (cur_audio && cur_audio->
fragments) {
1200 int64_t min_seq_no = 0;
1201 int64_t max_seq_no = 0;
1287 if (ret < buf_size) {
1306 if (seg->
size >= 0) {
1328 ret = (
int) seekret;
1342 static const int max_init_section_size = 1024 * 1024;
1354 "Failed to open an initialization section in playlist %d\n",
1364 sec_size = max_init_section_size;
1367 "Downloading an initialization section of size %"PRId64
"\n",
1370 sec_size =
FFMIN(sec_size, max_init_section_size);
1461 const char *
opts[] = {
"headers",
"user_agent",
"user-agent",
"cookies",
NULL }, **opt =
opts;
1467 if (buf[0] !=
'\0') {
1483 "A DASH playlist item '%s' referred to an external file '%s'. "
1484 "Opening this file was forbidden for security reasons\n",
1511 if (!avio_ctx_buffer ) {
1614 if (!ret &&
c->cur_video) {
1621 c->cur_video =
NULL;
1625 if (!ret &&
c->cur_audio) {
1632 c->cur_audio =
NULL;
1745 "last_seq_no[%"PRId64
"], playlist %d.\n",
1807 if (
av_stristr(p->
buf,
"dash:profile:isoff-on-demand:2011") ||
1820 #define OFFSET(x) offsetof(DASHContext, x)
1821 #define FLAGS AV_OPT_FLAG_DECODING_PARAM
1823 {
"allowed_extensions",
"List of file extensions that dash is allowed to access",
1825 {.str =
"aac,m4a,m4s,m4v,mov,mp4"},
1826 INT_MIN, INT_MAX,
FLAGS},
time_t av_timegm(struct tm *tm)
Convert the decomposed UTC time in tm to a time_t value.
int64_t probesize
Maximum size of the data read from input for determining the input container format.
const char const char void * val
void ff_make_absolute_url(char *buf, int size, const char *base, const char *rel)
Convert a relative url into an absolute url, given a base url.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
int64_t avio_size(AVIOContext *s)
Get the filesize.
char * allowed_extensions
AVIOInterruptCB interrupt_callback
Custom interrupt callbacks for the I/O layer.
static void move_segments(struct representation *rep_src, struct representation *rep_dest)
static int64_t get_segment_start_time_based_on_timeline(struct representation *pls, int64_t cur_seq_no)
struct representation * cur_audio
#define AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
static int read_data(void *opaque, uint8_t *buf, int buf_size)
char * av_stristr(const char *s1, const char *s2)
Locate the first case-independent occurrence in the string haystack of the string needle...
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
#define AVIO_FLAG_READ
read-only
unsigned char * buffer
Start of the buffer.
static struct fragment * get_current_fragment(struct representation *pls)
static void set_httpheader_options(DASHContext *c, AVDictionary *opts)
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
static int64_t calc_max_seg_no(struct representation *pls)
static const AVOption dash_options[]
static int64_t seek_data(void *opaque, int64_t offset, int whence)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
char * headers
holds HTTP headers set as an AVOption to the HTTP protocol context
static int parse_manifest_segmenturlnode(AVFormatContext *s, struct representation *rep, xmlNodePtr fragmenturl_node, xmlNodePtr *baseurl_nodes, char *rep_id_val, char *rep_bandwidth_val)
static void free_fragment(struct fragment **seg)
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
struct fragment * init_section
uint32_t init_sec_buf_read_offset
static uint64_t get_utc_date_time_insec(AVFormatContext *s, const char *datetime)
static int64_t start_time
uint64_t suggested_presentation_delay
uint64_t media_presentation_duration
static av_cold int end(AVCodecContext *avctx)
int64_t presentation_timeoffset
int id
Format-specific stream ID.
static int dash_close(AVFormatContext *s)
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
AVStream ** streams
A list of all streams in the file.
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
int flags
Flags modifying the (de)muxer behaviour.
static int parse_manifest_representation(AVFormatContext *s, const char *url, xmlNodePtr node, xmlNodePtr adaptionset_node, xmlNodePtr mpd_baseurl_node, xmlNodePtr period_baseurl_node, xmlNodePtr fragment_template_node, xmlNodePtr content_component_node, xmlNodePtr adaptionset_baseurl_node)
AVProgram * av_new_program(AVFormatContext *s, int id)
struct timeline ** timelines
#define AVERROR_EOF
End of file.
static av_cold int read_close(AVFormatContext *ctx)
#define AV_LOG_VERBOSE
Detailed information.
int av_match_ext(const char *filename, const char *extensions)
Return a positive value if the given filename has one of the given extensions, 0 otherwise.
uint64_t availability_start_time
static enum AVMediaType get_content_type(xmlNodePtr node)
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
#define INITIAL_BUFFER_SIZE
static xmlNodePtr find_child_node_by_name(xmlNodePtr rootnode, const char *nodename)
Callback for checking whether to abort blocking functions.
static char * get_content_url(xmlNodePtr *baseurl_nodes, int n_baseurl_nodes, char *rep_id_val, char *rep_bandwidth_val, char *val)
struct representation * cur_video
int av_probe_input_buffer(AVIOContext *pb, AVInputFormat **fmt, const char *url, void *logctx, unsigned int offset, unsigned int max_probe_size)
Like av_probe_input_buffer2() but returns 0 on success.
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
uint32_t init_sec_data_len
static void free_timelines_list(struct representation *pls)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
static int64_t calc_cur_seg_no(AVFormatContext *s, struct representation *pls)
int avio_close(AVIOContext *s)
Close the resource accessed by the AVIOContext s and free it.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values. ...
static int dash_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
char * av_strireplace(const char *str, const char *from, const char *to)
Locale-independent strings replace.
static const uint8_t offset[127][2]
New fields can be added to the end with minor version bumps.
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 read_from_url(struct representation *pls, struct fragment *seg, uint8_t *buf, int buf_size, enum ReadFromURLMode mode)
static int parse_manifest_adaptationset(AVFormatContext *s, const char *url, xmlNodePtr adaptionset_node, xmlNodePtr mpd_baseurl_node, xmlNodePtr period_baseurl_node)
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
uint64_t minimum_update_period
struct fragment ** fragments
static void free_representation(struct representation *pls)
AVIOInterruptCB * interrupt_callback
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
char * user_agent
holds HTTP user agent set as an AVOption to the HTTP protocol context
int seekable
A combination of AVIO_SEEKABLE_ flags or 0 when the stream is not seekable.
static int dash_seek(AVFormatContext *s, struct representation *pls, int64_t seek_pos_msec, int flags)
char filename[1024]
input or output filename
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
#define AV_TIME_BASE
Internal time base represented as integer.
void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
static void free_fragment_list(struct representation *pls)
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
GLsizei GLboolean const GLfloat * value
static uint32_t get_duration_insec(AVFormatContext *s, const char *duration)
static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url, AVDictionary *opts, AVDictionary *opts2, int *is_http)
static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in)
Usually treated as AVMEDIA_TYPE_DATA.
static int save_avio_options(AVFormatContext *s)
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd)
Rescale a 64-bit integer with specified rounding.
int64_t max_analyze_duration
Maximum duration (in AV_TIME_BASE units) of the data read from input in avformat_find_stream_info().
static char * get_val_from_nodes_tab(xmlNodePtr *nodes, const int n_nodes, const char *attrname)
static int nested_io_open(AVFormatContext *s, AVIOContext **pb, const char *url, int flags, AVDictionary **opts)
static int read_header(FFV1Context *f)
int64_t av_gettime(void)
Get the current time in microseconds.
static int dash_probe(AVProbeData *p)
void ff_dash_fill_tmpl_params(char *dst, size_t buffer_size, const char *template, int rep_id, int number, int bit_rate, int64_t time)
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
char * av_strdup(const char *s)
Duplicate a string.
int ff_check_interrupt(AVIOInterruptCB *cb)
Check if the user has requested to interrupt a blocking function associated with cb.
AVIOContext * pb
I/O context.
uint32_t init_sec_buf_size
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) returnNULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt)>2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);returnNULL;}returnac;}in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> in
static int dash_read_header(AVFormatContext *s)
uint64_t time_shift_buffer_depth
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Describe the class of an AVClass context structure.
static void update_options(char **dest, const char *name, void *src)
static int open_input(DASHContext *c, struct representation *pls, struct fragment *seg)
static int dash_read_packet(AVFormatContext *s, AVPacket *pkt)
static int parse_manifest_segmenttimeline(AVFormatContext *s, struct representation *rep, xmlNodePtr fragment_timeline_node)
int avio_open2(AVIOContext **s, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options)
Create and initialize a AVIOContext for accessing the resource indicated by url.
static void move_timelines(struct representation *rep_src, struct representation *rep_dest)
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
This structure contains the data a format has to probe a file.
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Return the next frame of a stream.
size_t av_strlcat(char *dst, const char *src, size_t size)
Append the string src to the string dst, but to a total length of no more than size - 1 bytes...
const char * avio_find_protocol_name(const char *url)
Return the name of the protocol that will handle the passed URL.
AVInputFormat ff_dash_demuxer
int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Seek to the keyframe at timestamp.
static int update_init_section(struct representation *pls)
char * cookies
holds HTTP cookie values set in either the initial response or as an AVOption to the HTTP protocol co...
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
int ffio_init_context(AVIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
Read packets of a media file to get stream information.
static const AVClass dash_class
int64_t fragment_duration
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set that converts the value to a string and stores it...
struct fragment * cur_seg
int pts_wrap_bits
number of bits in pts (used for wrapping control)
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
int64_t fragment_timescale
int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
void * priv_data
Format private data.
static uint64_t get_current_time_in_sec(void)
int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options)
Open an input stream and read the header.
static int64_t calc_min_seg_no(AVFormatContext *s, struct representation *pls)
int64_t duration
Duration of the stream, in AV_TIME_BASE fractional seconds.
AVCodecParameters * codecpar
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
static int reopen_demux_for_component(AVFormatContext *s, struct representation *pls)
int(* io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, AVDictionary **options)
This structure stores compressed data.
mode
Use these values in ebur128_init (or'ed).
static int64_t calc_next_seg_no_from_timelines(struct representation *pls, int64_t cur_time)
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
static int open_demux_for_component(AVFormatContext *s, struct representation *pls)
static av_cold void cleanup(FlashSV2Context *s)
static int refresh_manifest(AVFormatContext *s)