42 #define INITIAL_BUFFER_SIZE 32768 44 #define MAX_FIELD_LEN 64 45 #define MAX_CHARACTERISTICS_LEN 512 47 #define MPEG_TIME_BASE 90000 48 #define MPEG_TIME_BASE_Q (AVRational){1, MPEG_TIME_BASE} 221 for (i = 0; i < n_segments; i++) {
326 const char *
url,
const char *
base)
352 int key_len,
char **dest,
int *dest_len)
354 if (!strncmp(key,
"BANDWIDTH=", key_len)) {
357 }
else if (!strncmp(key,
"AUDIO=", key_len)) {
359 *dest_len =
sizeof(info->
audio);
360 }
else if (!strncmp(key,
"VIDEO=", key_len)) {
362 *dest_len =
sizeof(info->
video);
363 }
else if (!strncmp(key,
"SUBTITLES=", key_len)) {
376 int key_len,
char **dest,
int *dest_len)
378 if (!strncmp(key,
"METHOD=", key_len)) {
380 *dest_len =
sizeof(info->
method);
381 }
else if (!strncmp(key,
"URI=", key_len)) {
383 *dest_len =
sizeof(info->
uri);
384 }
else if (!strncmp(key,
"IV=", key_len)) {
386 *dest_len =
sizeof(info->
iv);
397 const char *url_base)
440 int key_len,
char **dest,
int *dest_len)
442 if (!strncmp(key,
"URI=", key_len)) {
444 *dest_len =
sizeof(info->
uri);
445 }
else if (!strncmp(key,
"BYTERANGE=", key_len)) {
464 const char *url_base)
468 char *characteristic;
472 if (!strcmp(info->
type,
"AUDIO"))
474 else if (!strcmp(info->
type,
"VIDEO"))
476 else if (!strcmp(info->
type,
"SUBTITLES"))
478 else if (!strcmp(info->
type,
"CLOSED-CAPTIONS"))
521 int langlen = strlen(rend->
language);
522 if (langlen <
sizeof(rend->
language) - 3) {
525 sizeof(rend->
language) - langlen - 2);
531 if (!strcmp(info->
forced,
"YES"))
535 while ((characteristic =
av_strtok(chr_ptr,
",", &saveptr))) {
536 if (!strcmp(characteristic,
"public.accessibility.describes-music-and-sound"))
538 else if (!strcmp(characteristic,
"public.accessibility.describes-video"))
548 int key_len,
char **dest,
int *dest_len)
550 if (!strncmp(key,
"TYPE=", key_len)) {
552 *dest_len =
sizeof(info->
type);
553 }
else if (!strncmp(key,
"URI=", key_len)) {
555 *dest_len =
sizeof(info->
uri);
556 }
else if (!strncmp(key,
"GROUP-ID=", key_len)) {
559 }
else if (!strncmp(key,
"LANGUAGE=", key_len)) {
562 }
else if (!strncmp(key,
"ASSOC-LANGUAGE=", key_len)) {
565 }
else if (!strncmp(key,
"NAME=", key_len)) {
567 *dest_len =
sizeof(info->
name);
568 }
else if (!strncmp(key,
"DEFAULT=", key_len)) {
571 }
else if (!strncmp(key,
"FORCED=", key_len)) {
573 *dest_len =
sizeof(info->
forced);
574 }
else if (!strncmp(key,
"CHARACTERISTICS=", key_len)) {
604 #if !CONFIG_HTTP_PROTOCOL 610 (*pb)->eof_reached = 0;
624 const char *proto_name =
NULL;
629 if (url[6] ==
'+' || url[6] ==
':')
632 if (url[4] ==
'+' || url[4] ==
':')
646 "Filename extension of \'%s\' is not a common multimedia extension, blocked for security reasons.\n" 647 "If you wish to override this adjust allowed_extensions, you can set it to \'ALL\' to allow all\n",
658 if (!strncmp(proto_name, url, strlen(proto_name)) && url[strlen(proto_name)] ==
':')
660 else if (
av_strstart(url,
"crypto",
NULL) && !strncmp(proto_name, url + 7, strlen(proto_name)) && url[7 + strlen(proto_name)] ==
':')
662 else if (
av_strstart(url,
"data",
NULL) && !strncmp(proto_name, url + 5, strlen(proto_name)) && url[5 + strlen(proto_name)] ==
':')
664 else if (strcmp(proto_name,
"file") || !strncmp(url,
"file,", 5))
675 }
else if (ret < 0) {
678 "keepalive request failed for '%s' with error: '%s' when opening url, retrying with new connection\n",
687 char *new_cookies =
NULL;
699 *is_http_out = is_http;
707 int ret = 0, is_segment = 0, is_variant = 0;
716 int64_t seg_offset = 0;
717 int64_t seg_size = -1;
724 int prev_n_segments = 0;
725 int64_t prev_start_seq_no = -1;
732 }
else if (ret < 0) {
735 "keepalive request failed for '%s' with error: '%s' when parsing playlist\n",
763 if (strcmp(line,
"#EXTM3U")) {
780 if (
av_strstart(line,
"#EXT-X-STREAM-INF:", &ptr)) {
782 memset(&variant_info, 0,
sizeof(variant_info));
785 }
else if (
av_strstart(line,
"#EXT-X-KEY:", &ptr)) {
791 if (!strcmp(info.
method,
"AES-128"))
793 if (!strcmp(info.
method,
"SAMPLE-AES"))
795 if (!strncmp(info.
iv,
"0x", 2) || !strncmp(info.
iv,
"0X", 2)) {
800 }
else if (
av_strstart(line,
"#EXT-X-MEDIA:", &ptr)) {
805 }
else if (
av_strstart(line,
"#EXT-X-TARGETDURATION:", &ptr)) {
810 }
else if (
av_strstart(line,
"#EXT-X-MEDIA-SEQUENCE:", &ptr)) {
815 seq_no = strtoull(ptr,
NULL, 10);
816 if (seq_no > INT64_MAX) {
818 "INT64_MAX, mask out the highest bit\n");
822 }
else if (
av_strstart(line,
"#EXT-X-PLAYLIST-TYPE:", &ptr)) {
826 if (!strcmp(ptr,
"EVENT"))
828 else if (!strcmp(ptr,
"VOD"))
830 }
else if (
av_strstart(line,
"#EXT-X-MAP:", &ptr)) {
840 memcpy(cur_init_section->
iv, iv,
sizeof(iv));
843 memset(cur_init_section->
iv, 0,
sizeof(cur_init_section->
iv));
855 if (!cur_init_section->
key) {
864 }
else if (
av_strstart(line,
"#EXT-X-ENDLIST", &ptr)) {
870 }
else if (
av_strstart(line,
"#EXT-X-BYTERANGE:", &ptr)) {
871 seg_size = strtoll(ptr,
NULL, 10);
872 ptr = strchr(ptr,
'@');
874 seg_offset = strtoll(ptr+1,
NULL, 10);
878 }
else if (line[0]) {
897 memcpy(seg->
iv, iv,
sizeof(iv));
900 memset(seg->
iv, 0,
sizeof(seg->
iv));
939 " set to default value to 1ms.\n", seg->
url);
947 seg->
size = seg_size;
950 seg_offset += seg_size;
966 for (i = 0; i < prev_n_segments && i <
diff; i++) {
970 " reflected in first_timestamp: %"PRId64
" -> %"PRId64
"\n",
1029 static const char id3_priv_owner_ts[] =
"com.apple.streaming.transportStreamTimestamp";
1033 for (meta = *extra_meta; meta; meta = meta->
next) {
1034 if (!strcmp(meta->
tag,
"PRIV")) {
1036 if (priv->
datasize == 8 && !strcmp(priv->
owner, id3_priv_owner_ts)) {
1040 if ((ts & ~((1ULL << 33) - 1)) == 0)
1045 }
else if (!strcmp(meta->
tag,
"APIC") && apic)
1059 if (!oldentry || strcmp(oldentry->
value, entry->
value) != 0)
1087 parse_id3(pls->
ctx, pb, &metadata, ×tamp, &apic, &extra_meta);
1123 int buf_size,
int *
len)
1128 int id3_buf_pos = 0;
1146 }
else if (*len <= 0) {
1157 int64_t maxsize = seg->
size >= 0 ? seg->
size : 1024*1024;
1159 int tag_got_bytes =
FFMIN(taglen, *len);
1160 int remaining = taglen - tag_got_bytes;
1162 if (taglen > maxsize) {
1178 memcpy(pls->
id3_buf + id3_buf_pos, buf, tag_got_bytes);
1179 id3_buf_pos += tag_got_bytes;
1182 *len -= tag_got_bytes;
1183 memmove(buf, buf + tag_got_bytes, *len);
1186 if (remaining > 0) {
1190 id3_buf_pos += remaining;
1201 if (*len >= 0 && (fill_buf || *len == 0)) {
1202 bytes =
read_from_url(pls, seg, buf + *len, buf_size - *len);
1231 if (seg->
size >= 0) {
1249 if (ret !=
sizeof(pls->
key)) {
1262 iv[32] = key[32] =
'\0';
1263 if (strstr(seg->
url,
"://"))
1264 snprintf(url,
sizeof(url),
"crypto+%s", seg->
url);
1266 snprintf(url,
sizeof(url),
"crypto:%s", seg->
url);
1278 "SAMPLE-AES encryption is not supported yet\n");
1294 if (ret == 0 && !is_http && seg->
url_offset) {
1311 static const int max_init_section_size = 1024*1024;
1328 "Failed to open an initialization section in playlist %d\n",
1338 sec_size = max_init_section_size;
1341 "Downloading an initialization section of size %"PRId64
"\n",
1344 sec_size =
FFMIN(sec_size, max_init_section_size);
1377 int stream_needed = 0;
1424 int just_opened = 0;
1425 int reload_count = 0;
1433 int64_t reload_interval;
1468 "skipping %"PRId64
" segments ahead, expired from playlists\n",
1527 c->
http_multiple = (!strncmp((
const char *)http_version_opt,
"1.1", 3) || !strncmp((
const char *)http_version_opt,
"2.0", 3));
1587 if (rend->
type == type && !strcmp(rend->
group_id, group_id)) {
1618 if (rend->
type != type)
1636 int64_t timestamp, int64_t *seq_no)
1642 if (timestamp < pos) {
1703 static const char *
const opts[] = {
1704 "headers",
"http_proxy",
"user_agent",
"cookies",
"referer",
"rw_timeout",
"icy",
NULL };
1705 const char *
const * opt =
opts;
1726 "A HLS playlist item '%s' referred to an external file '%s'. " 1727 "Opening this file was forbidden for security reasons\n",
1782 memcpy(dst_data, sd_src->
data, sd_src->
size);
1819 int flag_needed = 0;
1855 int64_t highest_cur_seq_no = 0;
2077 if (cur_needed && !pls->
needed) {
2089 }
else if (first && !cur_needed && pls->
needed) {
2136 int64_t ts_b,
struct playlist *pls_b)
2147 int ret,
i, minplaylist = -1;
2204 struct playlist *minpls = minplaylist < 0 ?
2206 if (minplaylist < 0) {
2209 int64_t dts = pls->
pkt.
dts;
2210 int64_t mindts = minpls->
pkt.
dts;
2220 if (minplaylist >= 0) {
2249 av_log(s,
AV_LOG_ERROR,
"stream index inconsistency: index %d, %d main streams, %d subdemuxer streams\n",
2281 int64_t timestamp,
int flags)
2286 int stream_subdemuxer_index;
2304 if (0 < duration && duration < seek_timestamp - first_timestamp)
2313 stream_subdemuxer_index = j;
2346 if (pls != seek_pls) {
2366 if (strncmp(p->
buf,
"#EXTM3U", 7))
2369 if (strstr(p->
buf,
"#EXT-X-STREAM-INF:") ||
2370 strstr(p->
buf,
"#EXT-X-TARGETDURATION:") ||
2371 strstr(p->
buf,
"#EXT-X-MEDIA-SEQUENCE:"))
2376 #define OFFSET(x) offsetof(HLSContext, x) 2377 #define FLAGS AV_OPT_FLAG_DECODING_PARAM 2379 {
"live_start_index",
"segment index to start live streams at (negative values are from the end)",
2381 {
"allowed_extensions",
"List of file extensions that hls is allowed to access",
2383 {.str =
"3gp,aac,avi,ac3,eac3,flac,mkv,m3u8,m4a,m4s,m4v,mpg,mov,mp2,mp3,mp4,mpeg,mpegts,ogg,ogv,oga,ts,vob,wav"},
2384 INT_MIN, INT_MAX, FLAGS},
2385 {
"max_reload",
"Maximum number of times a insufficient list is attempted to be reloaded",
2387 {
"m3u8_hold_counters",
"The maximum number of times to load m3u8 when it refreshes without new segments",
2389 {
"http_persistent",
"Use persistent HTTP connections",
2391 {
"http_multiple",
"Use multiple HTTP connections for fetching segments",
2393 {
"http_seekable",
"Use HTTP partial requests, 0 = disable, 1 = enable, -1 = auto",
#define FF_COMPLIANCE_EXPERIMENTAL
Allow nonstandardized experimental things.
int64_t probesize
Maximum size of the data read from input for determining the input container format.
int(* io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, AVDictionary **options)
A callback for opening new IO streams.
int ff_id3v2_parse_priv(AVFormatContext *s, ID3v2ExtraMeta *extra_meta)
Add metadata for all PRIV tags in the ID3v2 header.
static int update_init_section(struct playlist *pls, struct segment *seg)
struct segment * init_section
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
int64_t avio_size(AVIOContext *s)
Get the filesize.
static int read_from_url(struct playlist *pls, struct segment *seg, uint8_t *buf, int buf_size)
char assoc_language[MAX_FIELD_LEN]
AVIOInterruptCB interrupt_callback
Custom interrupt callbacks for the I/O layer.
AVDictionary * id3_initial
static int set_stream_info_from_input_stream(AVStream *st, struct playlist *pls, AVStream *ist)
struct segment ** init_sections
static void handle_init_section_args(struct init_section_info *info, const char *key, int key_len, char **dest, int *dest_len)
#define AV_LOG_WARNING
Something somehow does not look correct.
unsigned int id3_buf_size
ID3v2ExtraMeta * id3_deferred_extra
#define LIBAVUTIL_VERSION_INT
unsigned char * buf_ptr
Current position in the buffer.
unsigned char * buf_end
End of the data, may be less than buffer+buffer_size if the read function returned less data than req...
int event_flags
Flags indicating events happening on the stream, a combination of AVSTREAM_EVENT_FLAG_*.
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
static struct rendition * new_rendition(HLSContext *c, struct rendition_info *info, const char *url_base)
static int64_t default_reload_interval(struct playlist *pls)
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
unsigned int init_sec_data_len
int index
stream index in AVFormatContext
#define ID3v2_DEFAULT_MAGIC
Default magic bytes for ID3v2 header: "ID3".
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
const char * av_default_item_name(void *ptr)
Return the context name.
#define AVIO_FLAG_READ
read-only
char language[MAX_FIELD_LEN]
unsigned char * buffer
Start of the buffer.
int av_strncasecmp(const char *a, const char *b, size_t n)
Locale-independent case-insensitive compare.
int event_flags
Flags indicating events happening on the file, a combination of AVFMT_EVENT_FLAG_*.
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options)
Open an input stream and read the header.
static void fill_buf(uint8_t *data, int w, int h, int linesize, uint8_t v)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
int av_usleep(unsigned usec)
Sleep for a period of time.
AVPacketSideData * side_data
An array of side data that applies to the whole stream (i.e.
static void handle_rendition_args(struct rendition_info *info, const char *key, int key_len, char **dest, int *dest_len)
#define MAX_CHARACTERISTICS_LEN
int av_probe_input_buffer(AVIOContext *pb, ff_const59 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 ctx_flags
Flags signalling stream properties.
int strict_std_compliance
Allow non-standard and experimental extension.
static int id3_has_changed_values(struct playlist *pls, AVDictionary *metadata, ID3v2ExtraMetaAPIC *apic)
static int find_timestamp_in_playlist(HLSContext *c, struct playlist *pls, int64_t timestamp, int64_t *seq_no)
unsigned int nb_stream_indexes
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define av_assert0(cond)
assert() equivalent, that is always enabled.
unsigned int init_sec_buf_read_offset
#define ID3v2_HEADER_SIZE
char group_id[MAX_FIELD_LEN]
char audio[MAX_FIELD_LEN]
static void free_rendition_list(HLSContext *c)
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
static struct segment * next_segment(struct playlist *pls)
int id
Format-specific stream ID.
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But first
static void intercept_id3(struct playlist *pls, uint8_t *buf, int buf_size, int *len)
static struct playlist * new_playlist(HLSContext *c, const char *url, const char *base)
int nb_side_data
The number of elements in the AVStream.side_data array.
AVInputFormat ff_hls_demuxer
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.
static void handle_id3(AVIOContext *pb, struct playlist *pls)
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
#define AVERROR_PROTOCOL_NOT_FOUND
Protocol not found.
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.
AVProgram * av_new_program(AVFormatContext *s, int id)
void av_packet_move_ref(AVPacket *dst, AVPacket *src)
Move every field in src to dst and reset src.
static int read_data(void *opaque, uint8_t *buf, int buf_size)
#define AVERROR_EOF
End of file.
unsigned int init_sec_buf_size
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.
struct rendition ** renditions
int ff_http_do_new_request2(URLContext *h, const char *uri, AVDictionary **opts)
Send a new HTTP request, reusing the old connection.
enum AVDiscard discard
selects which program to discard and which to feed to the caller
static void add_metadata_from_renditions(AVFormatContext *s, struct playlist *pls, enum AVMediaType type)
unsigned int * stream_index
static void free_playlist_list(HLSContext *c)
struct rendition ** renditions
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
struct variant ** variants
static void free_segment_dynarray(struct segment **segments, int n_segments)
static AVRational get_timebase(struct playlist *pls)
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Callback for checking whether to abort blocking functions.
AVIOContext * playlist_pb
static int compare_ts_with_wrapdetect(int64_t ts_a, struct playlist *pls_a, int64_t ts_b, struct playlist *pls_b)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define AV_DICT_MATCH_CASE
Only get an entry with exact-case key match.
AVDictionary * metadata
Metadata that applies to the whole file.
char video_group[MAX_FIELD_LEN]
static const AVClass hls_class
AVIOInterruptCB * interrupt_callback
static void handle_key_args(struct key_info *info, const char *key, int key_len, char **dest, int *dest_len)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
char * url
input or output URL.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
int64_t id3_mpegts_timestamp
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values. ...
static void free_segment_list(struct playlist *pls)
enum AVMediaType codec_type
General type of the encoded data.
void ff_id3v2_free_extra_meta(ID3v2ExtraMeta **extra_meta)
Free memory allocated parsing special (non-text) metadata.
simple assert() macros that are a bit more flexible than ISO C assert().
static int update_streams_from_subdemuxer(AVFormatContext *s, struct playlist *pls)
enum AVPacketSideDataType type
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.
int flags
A combination of AV_PKT_FLAG values.
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.
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
char group_id[MAX_FIELD_LEN]
static struct segment * current_segment(struct playlist *pls)
static int nested_io_open(AVFormatContext *s, AVIOContext **pb, const char *url, int flags, AVDictionary **opts)
#define AV_TIME_BASE
Internal time base represented as integer.
void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
#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...
char * allowed_extensions
static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url, AVDictionary **opts, AVDictionary *opts2, int *is_http_out)
static void add_renditions_to_variant(HLSContext *c, struct variant *var, enum AVMediaType type, const char *group_id)
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C program
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
static int hls_read_packet(AVFormatContext *s, AVPacket *pkt)
static struct segment * new_init_section(struct playlist *pls, struct init_section_info *info, const char *url_base)
void * av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
Reallocate the given buffer if it is not large enough, otherwise do nothing.
int 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.
uint8_t * av_stream_new_side_data(AVStream *stream, enum AVPacketSideDataType type, int size)
Allocate new information from stream.
static struct variant * new_variant(HLSContext *c, struct variant_info *info, const char *url, const char *base)
Usually treated as AVMEDIA_TYPE_DATA.
static void fill_timing_for_id3_timestamped_stream(struct playlist *pls)
struct segment ** segments
static int64_t select_cur_seq_no(HLSContext *c, struct playlist *pls)
#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().
char subtitles_group[MAX_FIELD_LEN]
static int read_header(FFV1Context *f)
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
int avformat_queue_attached_pictures(AVFormatContext *s)
static void parse_id3(AVFormatContext *s, AVIOContext *pb, AVDictionary **metadata, int64_t *dts, ID3v2ExtraMetaAPIC **apic, ID3v2ExtraMeta **extra_meta)
#define AV_LOG_INFO
Standard information.
char * av_strdup(const char *s)
Duplicate a string.
char subtitles[MAX_FIELD_LEN]
AVStreamInternal * internal
An opaque field for libavformat internal usage.
int ff_check_interrupt(AVIOInterruptCB *cb)
Check if the user has requested to interrupt a blocking function associated with cb.
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
AVIOContext * pb
I/O context.
static int parse_playlist(HLSContext *c, const char *url, struct playlist *pls, AVIOContext *in)
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
uint8_t * data
The data buffer.
static const AVOption hls_options[]
static int hls_read_header(AVFormatContext *s)
int ff_id3v2_parse_apic(AVFormatContext *s, ID3v2ExtraMeta *extra_meta)
Create a stream for each APIC (attached picture) extracted from the ID3v2 header. ...
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
struct playlist ** playlists
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
static int open_input(HLSContext *c, struct playlist *pls, struct segment *seg, AVIOContext **in)
Undefined Behavior In the C language
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;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);return NULL;}return ac;}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;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->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);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
Describe the class of an AVClass context structure.
int ff_id3v2_parse_priv_dict(AVDictionary **metadata, ID3v2ExtraMeta *extra_meta)
Parse PRIV tags into a dictionary.
static void update_noheader_flag(AVFormatContext *s)
Rational number (pair of numerator and denominator).
struct segment * cur_init_section
static int save_avio_options(AVFormatContext *s)
#define AV_OPT_ALLOW_NULL
In av_opt_get, return NULL if the option has a pointer type and is set to NULL, rather than returning...
int need_context_update
Whether the internal avctx needs to be updated from codecpar (after a late change to codecpar) ...
struct playlist * playlist
static void add_stream_to_programs(AVFormatContext *s, struct playlist *pls, AVStream *stream)
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.
static void handle_variant_args(struct variant_info *info, const char *key, int key_len, char **dest, int *dest_len)
const char * avio_find_protocol_name(const char *url)
Return the name of the protocol that will handle the passed URL.
int size
Size of data in bytes.
URLContext * ffio_geturlcontext(AVIOContext *s)
Return the URLContext associated with the AVIOContext.
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
char audio_group[MAX_FIELD_LEN]
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
#define flags(name, subs,...)
static int recheck_discard_flags(AVFormatContext *s, int first)
char characteristics[MAX_CHARACTERISTICS_LEN]
char * av_strtok(char *s, const char *delim, char **saveptr)
Split the string into several tokens which can be accessed by successive calls to av_strtok()...
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
char language[MAX_FIELD_LEN]
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_RB64
const OptionDef options[]
#define INITIAL_BUFFER_SIZE
int ff_id3v2_match(const uint8_t *buf, const char *magic)
Detect ID3v2 Header.
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))
static int playlist_needed(struct playlist *pls)
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
Read packets of a media file to get stream information.
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...
int disposition
AV_DISPOSITION_* bit field.
static int open_url_keepalive(AVFormatContext *s, AVIOContext **pb, const char *url, AVDictionary **options)
int64_t pos
position in the file of the current buffer
int pts_wrap_bits
number of bits in pts (used for wrapping control)
void av_init_packet(AVPacket *pkt)
Initialize optional fields of a packet with default values.
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
static int ensure_playlist(HLSContext *c, struct playlist **pls, const char *url)
static int hls_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
A Quick Description Of Rate Distortion Theory We want to encode a video
static av_always_inline int diff(const uint32_t a, const uint32_t b)
int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
void ff_id3v2_read_dict(AVIOContext *pb, AVDictionary **metadata, const char *magic, ID3v2ExtraMeta **extra_meta)
Read an ID3v2 tag into specified dictionary and retrieve supported extra metadata.
int eof_reached
true if was unable to read due to error or eof
int ff_id3v2_tag_len(const uint8_t *buf)
Get the length of an ID3v2 tag.
void * priv_data
Format private data.
static int hls_probe(const AVProbeData *p)
struct playlist ** playlists
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
char video[MAX_FIELD_LEN]
int64_t duration
Duration of the stream, in AV_TIME_BASE fractional seconds.
#define AV_DICT_IGNORE_SUFFIX
Return first entry in a dictionary whose first part corresponds to the search key, ignoring the suffix of the found key string.
AVCodecParameters * codecpar
Codec parameters associated with this stream.
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
#define FFSWAP(type, a, b)
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
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
static void free_init_section_list(struct playlist *pls)
static void free_variant_list(HLSContext *c)
int ff_get_chomp_line(AVIOContext *s, char *buf, int maxlen)
Same as ff_get_line but strip the white-space characters in the text tail.
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
char key_url[MAX_URL_SIZE]
static int hls_close(AVFormatContext *s)
This structure stores compressed data.
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
AVPacket attached_pic
For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet will contain the attached pictu...
#define AV_NOPTS_VALUE
Undefined timestamp value.
static av_cold void cleanup(FlashSV2Context *s)
int64_t av_compare_mod(uint64_t a, uint64_t b, uint64_t mod)
Compare the remainders of two integer operands divided by a common divisor.