FFmpeg
Data Structures | Macros | Enumerations | Functions | Variables
hls.c File Reference
#include "config_components.h"
#include "libavformat/http.h"
#include "libavutil/aes.h"
#include "libavutil/avstring.h"
#include "libavutil/avassert.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/mathematics.h"
#include "libavutil/opt.h"
#include "libavutil/dict.h"
#include "libavutil/time.h"
#include "avformat.h"
#include "demux.h"
#include "internal.h"
#include "avio_internal.h"
#include "id3v2.h"
#include "url.h"
#include "hls_sample_encryption.h"

Go to the source code of this file.

Data Structures

struct  segment
 
struct  playlist
 
struct  rendition
 
struct  variant
 
struct  HLSContext
 
struct  variant_info
 
struct  key_info
 
struct  init_section_info
 
struct  rendition_info
 

Macros

#define INITIAL_BUFFER_SIZE   32768
 
#define MAX_FIELD_LEN   64
 
#define MAX_CHARACTERISTICS_LEN   512
 
#define MPEG_TIME_BASE   90000
 
#define MPEG_TIME_BASE_Q   (AVRational){1, MPEG_TIME_BASE}
 
#define OFFSET(x)   offsetof(HLSContext, x)
 
#define FLAGS   AV_OPT_FLAG_DECODING_PARAM
 

Enumerations

enum  KeyType { KEY_NONE, KEY_AES_128, KEY_SAMPLE_AES }
 
enum  PlaylistType {
  PLS_TYPE_UNSPECIFIED, PLS_TYPE_EVENT, PLS_TYPE_VOD, PLAYLIST_TYPE_NONE,
  PLAYLIST_TYPE_EVENT, PLAYLIST_TYPE_VOD, PLAYLIST_TYPE_NB
}
 

Functions

static void free_segment_dynarray (struct segment **segments, int n_segments)
 
static void free_segment_list (struct playlist *pls)
 
static void free_init_section_list (struct playlist *pls)
 
static void free_playlist_list (HLSContext *c)
 
static void free_variant_list (HLSContext *c)
 
static void free_rendition_list (HLSContext *c)
 
static struct playlistnew_playlist (HLSContext *c, const char *url, const char *base)
 
static struct variantnew_variant (HLSContext *c, struct variant_info *info, const char *url, const char *base)
 
static void handle_variant_args (struct variant_info *info, const char *key, int key_len, char **dest, int *dest_len)
 
static void handle_key_args (struct key_info *info, const char *key, int key_len, char **dest, int *dest_len)
 
static struct segmentnew_init_section (struct playlist *pls, struct init_section_info *info, const char *url_base)
 
static void handle_init_section_args (struct init_section_info *info, const char *key, int key_len, char **dest, int *dest_len)
 
static struct renditionnew_rendition (HLSContext *c, struct rendition_info *info, const char *url_base)
 
static void handle_rendition_args (struct rendition_info *info, const char *key, int key_len, char **dest, int *dest_len)
 
static int ensure_playlist (HLSContext *c, struct playlist **pls, const char *url)
 
static int open_url_keepalive (AVFormatContext *s, AVIOContext **pb, const char *url, AVDictionary **options)
 
static int open_url (AVFormatContext *s, AVIOContext **pb, const char *url, AVDictionary **opts, AVDictionary *opts2, int *is_http_out)
 
static int parse_playlist (HLSContext *c, const char *url, struct playlist *pls, AVIOContext *in)
 
static struct segmentcurrent_segment (struct playlist *pls)
 
static struct segmentnext_segment (struct playlist *pls)
 
static int read_from_url (struct playlist *pls, struct segment *seg, uint8_t *buf, int buf_size)
 
static void parse_id3 (AVFormatContext *s, AVIOContext *pb, AVDictionary **metadata, int64_t *dts, HLSAudioSetupInfo *audio_setup_info, ID3v2ExtraMetaAPIC **apic, ID3v2ExtraMeta **extra_meta)
 
static int id3_has_changed_values (struct playlist *pls, AVDictionary *metadata, ID3v2ExtraMetaAPIC *apic)
 
static void handle_id3 (AVIOContext *pb, struct playlist *pls)
 
static void intercept_id3 (struct playlist *pls, uint8_t *buf, int buf_size, int *len)
 
static int open_input (HLSContext *c, struct playlist *pls, struct segment *seg, AVIOContext **in)
 
static int update_init_section (struct playlist *pls, struct segment *seg)
 
static int64_t default_reload_interval (struct playlist *pls)
 
static int playlist_needed (struct playlist *pls)
 
static int read_data (void *opaque, uint8_t *buf, int buf_size)
 
static void add_renditions_to_variant (HLSContext *c, struct variant *var, enum AVMediaType type, const char *group_id)
 
static void add_metadata_from_renditions (AVFormatContext *s, struct playlist *pls, enum AVMediaType type)
 
static int find_timestamp_in_playlist (HLSContext *c, struct playlist *pls, int64_t timestamp, int64_t *seq_no, int64_t *seg_start_ts)
 
static int64_t select_cur_seq_no (HLSContext *c, struct playlist *pls)
 
static int nested_io_open (AVFormatContext *s, AVIOContext **pb, const char *url, int flags, AVDictionary **opts)
 
static void add_stream_to_programs (AVFormatContext *s, struct playlist *pls, AVStream *stream)
 
static int set_stream_info_from_input_stream (AVStream *st, struct playlist *pls, AVStream *ist)
 
static int update_streams_from_subdemuxer (AVFormatContext *s, struct playlist *pls)
 
static void update_noheader_flag (AVFormatContext *s)
 
static int hls_close (AVFormatContext *s)
 
static int hls_read_header (AVFormatContext *s)
 
static int recheck_discard_flags (AVFormatContext *s, int first)
 
static void fill_timing_for_id3_timestamped_stream (struct playlist *pls)
 
static AVRational get_timebase (struct playlist *pls)
 
static int compare_ts_with_wrapdetect (int64_t ts_a, struct playlist *pls_a, int64_t ts_b, struct playlist *pls_b)
 
static int hls_read_packet (AVFormatContext *s, AVPacket *pkt)
 
static int hls_read_seek (AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
 
static int hls_probe (const AVProbeData *p)
 

Variables

static const AVOption hls_options []
 
static const AVClass hls_class
 
const FFInputFormat ff_hls_demuxer
 

Detailed Description

Apple HTTP Live Streaming demuxer https://www.rfc-editor.org/rfc/rfc8216.txt

Definition in file hls.c.

Macro Definition Documentation

◆ INITIAL_BUFFER_SIZE

#define INITIAL_BUFFER_SIZE   32768

Definition at line 50 of file hls.c.

◆ MAX_FIELD_LEN

#define MAX_FIELD_LEN   64

Definition at line 52 of file hls.c.

◆ MAX_CHARACTERISTICS_LEN

#define MAX_CHARACTERISTICS_LEN   512

Definition at line 53 of file hls.c.

◆ MPEG_TIME_BASE

#define MPEG_TIME_BASE   90000

Definition at line 55 of file hls.c.

◆ MPEG_TIME_BASE_Q

#define MPEG_TIME_BASE_Q   (AVRational){1, MPEG_TIME_BASE}

Definition at line 56 of file hls.c.

◆ OFFSET

#define OFFSET (   x)    offsetof(HLSContext, x)

Definition at line 2562 of file hls.c.

◆ FLAGS

#define FLAGS   AV_OPT_FLAG_DECODING_PARAM

Definition at line 2563 of file hls.c.

Enumeration Type Documentation

◆ KeyType

enum KeyType
Enumerator
KEY_NONE 
KEY_AES_128 
KEY_SAMPLE_AES 

Definition at line 70 of file hls.c.

◆ PlaylistType

Enumerator
PLS_TYPE_UNSPECIFIED 
PLS_TYPE_EVENT 
PLS_TYPE_VOD 
PLAYLIST_TYPE_NONE 
PLAYLIST_TYPE_EVENT 
PLAYLIST_TYPE_VOD 
PLAYLIST_TYPE_NB 

Definition at line 90 of file hls.c.

Function Documentation

◆ free_segment_dynarray()

static void free_segment_dynarray ( struct segment **  segments,
int  n_segments 
)
static

Definition at line 234 of file hls.c.

Referenced by free_segment_list(), and parse_playlist().

◆ free_segment_list()

static void free_segment_list ( struct playlist pls)
static

Definition at line 244 of file hls.c.

Referenced by free_playlist_list().

◆ free_init_section_list()

static void free_init_section_list ( struct playlist pls)
static

Definition at line 251 of file hls.c.

Referenced by free_playlist_list().

◆ free_playlist_list()

static void free_playlist_list ( HLSContext c)
static

Definition at line 263 of file hls.c.

Referenced by hls_close().

◆ free_variant_list()

static void free_variant_list ( HLSContext c)
static

Definition at line 292 of file hls.c.

Referenced by hls_close().

◆ free_rendition_list()

static void free_rendition_list ( HLSContext c)
static

Definition at line 304 of file hls.c.

Referenced by hls_close().

◆ new_playlist()

static struct playlist* new_playlist ( HLSContext c,
const char *  url,
const char *  base 
)
static

Definition at line 313 of file hls.c.

Referenced by new_rendition(), and new_variant().

◆ new_variant()

static struct variant* new_variant ( HLSContext c,
struct variant_info info,
const char *  url,
const char *  base 
)
static

Definition at line 347 of file hls.c.

Referenced by ensure_playlist(), and parse_playlist().

◆ handle_variant_args()

static void handle_variant_args ( struct variant_info info,
const char *  key,
int  key_len,
char **  dest,
int dest_len 
)
static

Definition at line 373 of file hls.c.

Referenced by parse_playlist().

◆ handle_key_args()

static void handle_key_args ( struct key_info info,
const char *  key,
int  key_len,
char **  dest,
int dest_len 
)
static

Definition at line 397 of file hls.c.

Referenced by parse_playlist().

◆ new_init_section()

static struct segment* new_init_section ( struct playlist pls,
struct init_section_info info,
const char *  url_base 
)
static

Definition at line 417 of file hls.c.

Referenced by parse_playlist().

◆ handle_init_section_args()

static void handle_init_section_args ( struct init_section_info info,
const char *  key,
int  key_len,
char **  dest,
int dest_len 
)
static

Definition at line 461 of file hls.c.

Referenced by parse_playlist().

◆ new_rendition()

static struct rendition* new_rendition ( HLSContext c,
struct rendition_info info,
const char *  url_base 
)
static

Definition at line 485 of file hls.c.

Referenced by parse_playlist().

◆ handle_rendition_args()

static void handle_rendition_args ( struct rendition_info info,
const char *  key,
int  key_len,
char **  dest,
int dest_len 
)
static

Definition at line 574 of file hls.c.

Referenced by parse_playlist().

◆ ensure_playlist()

static int ensure_playlist ( HLSContext c,
struct playlist **  pls,
const char *  url 
)
static

Definition at line 618 of file hls.c.

Referenced by parse_playlist().

◆ open_url_keepalive()

static int open_url_keepalive ( AVFormatContext s,
AVIOContext **  pb,
const char *  url,
AVDictionary **  options 
)
static

Definition at line 628 of file hls.c.

Referenced by open_url(), and parse_playlist().

◆ open_url()

static int open_url ( AVFormatContext s,
AVIOContext **  pb,
const char *  url,
AVDictionary **  opts,
AVDictionary opts2,
int is_http_out 
)
static

Definition at line 646 of file hls.c.

Referenced by open_input().

◆ parse_playlist()

static int parse_playlist ( HLSContext c,
const char *  url,
struct playlist pls,
AVIOContext in 
)
static

Definition at line 733 of file hls.c.

Referenced by hls_read_header(), read_data(), and select_cur_seq_no().

◆ current_segment()

static struct segment* current_segment ( struct playlist pls)
static

Definition at line 1049 of file hls.c.

Referenced by hls_read_header(), hls_read_packet(), intercept_id3(), and read_data().

◆ next_segment()

static struct segment* next_segment ( struct playlist pls)
static

Definition at line 1057 of file hls.c.

Referenced by read_data().

◆ read_from_url()

static int read_from_url ( struct playlist pls,
struct segment seg,
uint8_t *  buf,
int  buf_size 
)
static

Definition at line 1065 of file hls.c.

Referenced by intercept_id3(), read_data(), and update_init_section().

◆ parse_id3()

static void parse_id3 ( AVFormatContext s,
AVIOContext pb,
AVDictionary **  metadata,
int64_t *  dts,
HLSAudioSetupInfo audio_setup_info,
ID3v2ExtraMetaAPIC **  apic,
ID3v2ExtraMeta **  extra_meta 
)
static

Definition at line 1082 of file hls.c.

Referenced by handle_id3().

◆ id3_has_changed_values()

static int id3_has_changed_values ( struct playlist pls,
AVDictionary metadata,
ID3v2ExtraMetaAPIC apic 
)
static

Definition at line 1111 of file hls.c.

Referenced by handle_id3().

◆ handle_id3()

static void handle_id3 ( AVIOContext pb,
struct playlist pls 
)
static

Definition at line 1140 of file hls.c.

Referenced by intercept_id3().

◆ intercept_id3()

static void intercept_id3 ( struct playlist pls,
uint8_t *  buf,
int  buf_size,
int len 
)
static

Definition at line 1182 of file hls.c.

Referenced by read_data().

◆ open_input()

static int open_input ( HLSContext c,
struct playlist pls,
struct segment seg,
AVIOContext **  in 
)
static

Definition at line 1282 of file hls.c.

Referenced by read_data(), and update_init_section().

◆ update_init_section()

static int update_init_section ( struct playlist pls,
struct segment seg 
)
static

Definition at line 1365 of file hls.c.

Referenced by read_data().

◆ default_reload_interval()

static int64_t default_reload_interval ( struct playlist pls)
static

Definition at line 1422 of file hls.c.

Referenced by read_data(), and select_cur_seq_no().

◆ playlist_needed()

static int playlist_needed ( struct playlist pls)
static

Definition at line 1429 of file hls.c.

Referenced by read_data(), and recheck_discard_flags().

◆ read_data()

static int read_data ( void *  opaque,
uint8_t *  buf,
int  buf_size 
)
static

Definition at line 1475 of file hls.c.

Referenced by hls_read_header().

◆ add_renditions_to_variant()

static void add_renditions_to_variant ( HLSContext c,
struct variant var,
enum AVMediaType  type,
const char *  group_id 
)
static

Definition at line 1645 of file hls.c.

Referenced by hls_read_header().

◆ add_metadata_from_renditions()

static void add_metadata_from_renditions ( AVFormatContext s,
struct playlist pls,
enum AVMediaType  type 
)
static

Definition at line 1669 of file hls.c.

Referenced by hls_read_header().

◆ find_timestamp_in_playlist()

static int find_timestamp_in_playlist ( HLSContext c,
struct playlist pls,
int64_t  timestamp,
int64_t *  seq_no,
int64_t *  seg_start_ts 
)
static

Definition at line 1701 of file hls.c.

Referenced by hls_read_seek(), and select_cur_seq_no().

◆ select_cur_seq_no()

static int64_t select_cur_seq_no ( HLSContext c,
struct playlist pls 
)
static

Definition at line 1731 of file hls.c.

Referenced by hls_read_header(), and recheck_discard_flags().

◆ nested_io_open()

static int nested_io_open ( AVFormatContext s,
AVIOContext **  pb,
const char *  url,
int  flags,
AVDictionary **  opts 
)
static

Definition at line 1806 of file hls.c.

Referenced by hls_read_header().

◆ add_stream_to_programs()

static void add_stream_to_programs ( AVFormatContext s,
struct playlist pls,
AVStream stream 
)
static

Definition at line 1816 of file hls.c.

Referenced by update_streams_from_subdemuxer().

◆ set_stream_info_from_input_stream()

static int set_stream_info_from_input_stream ( AVStream st,
struct playlist pls,
AVStream ist 
)
static

Definition at line 1842 of file hls.c.

Referenced by hls_read_packet(), and update_streams_from_subdemuxer().

◆ update_streams_from_subdemuxer()

static int update_streams_from_subdemuxer ( AVFormatContext s,
struct playlist pls 
)
static

Definition at line 1866 of file hls.c.

Referenced by hls_read_header(), and hls_read_packet().

◆ update_noheader_flag()

static void update_noheader_flag ( AVFormatContext s)
static

Definition at line 1891 of file hls.c.

Referenced by hls_read_header(), and hls_read_packet().

◆ hls_close()

static int hls_close ( AVFormatContext s)
static

Definition at line 1912 of file hls.c.

◆ hls_read_header()

static int hls_read_header ( AVFormatContext s)
static

Definition at line 1929 of file hls.c.

◆ recheck_discard_flags()

static int recheck_discard_flags ( AVFormatContext s,
int  first 
)
static

Definition at line 2207 of file hls.c.

Referenced by hls_read_packet().

◆ fill_timing_for_id3_timestamped_stream()

static void fill_timing_for_id3_timestamped_stream ( struct playlist pls)
static

Definition at line 2247 of file hls.c.

Referenced by hls_read_packet().

◆ get_timebase()

static AVRational get_timebase ( struct playlist pls)
static

Definition at line 2272 of file hls.c.

Referenced by compare_ts_with_wrapdetect(), and hls_read_packet().

◆ compare_ts_with_wrapdetect()

static int compare_ts_with_wrapdetect ( int64_t  ts_a,
struct playlist pls_a,
int64_t  ts_b,
struct playlist pls_b 
)
static

Definition at line 2280 of file hls.c.

Referenced by hls_read_packet().

◆ hls_read_packet()

static int hls_read_packet ( AVFormatContext s,
AVPacket pkt 
)
static

Definition at line 2289 of file hls.c.

◆ hls_read_seek()

static int hls_read_seek ( AVFormatContext s,
int  stream_index,
int64_t  timestamp,
int  flags 
)
static

Definition at line 2434 of file hls.c.

◆ hls_probe()

static int hls_probe ( const AVProbeData p)
static

Definition at line 2526 of file hls.c.

Variable Documentation

◆ hls_options

const AVOption hls_options[]
static
Initial value:
= {
{"live_start_index", "segment index to start live streams at (negative values are from the end)",
OFFSET(live_start_index), AV_OPT_TYPE_INT, {.i64 = -3}, INT_MIN, INT_MAX, FLAGS},
{"prefer_x_start", "prefer to use #EXT-X-START if it's in playlist instead of live_start_index",
OFFSET(prefer_x_start), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, FLAGS},
{"allowed_extensions", "List of file extensions that hls is allowed to access",
OFFSET(allowed_extensions), AV_OPT_TYPE_STRING,
{.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"},
INT_MIN, INT_MAX, FLAGS},
{"max_reload", "Maximum number of times a insufficient list is attempted to be reloaded",
OFFSET(max_reload), AV_OPT_TYPE_INT, {.i64 = 3}, 0, INT_MAX, FLAGS},
{"m3u8_hold_counters", "The maximum number of times to load m3u8 when it refreshes without new segments",
OFFSET(m3u8_hold_counters), AV_OPT_TYPE_INT, {.i64 = 1000}, 0, INT_MAX, FLAGS},
{"http_persistent", "Use persistent HTTP connections",
OFFSET(http_persistent), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS },
{"http_multiple", "Use multiple HTTP connections for fetching segments",
OFFSET(http_multiple), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, FLAGS},
{"http_seekable", "Use HTTP partial requests, 0 = disable, 1 = enable, -1 = auto",
OFFSET(http_seekable), AV_OPT_TYPE_BOOL, { .i64 = -1}, -1, 1, FLAGS},
{"seg_format_options", "Set options for segment demuxer",
OFFSET(seg_format_opts), AV_OPT_TYPE_DICT, {.str = NULL}, 0, 0, FLAGS},
{"seg_max_retry", "Maximum number of times to reload a segment on error.",
OFFSET(seg_max_retry), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, FLAGS},
{NULL}
}

Definition at line 2564 of file hls.c.

◆ hls_class

const AVClass hls_class
static
Initial value:
= {
.class_name = "hls demuxer",
.item_name = av_default_item_name,
.option = hls_options,
}

Definition at line 2590 of file hls.c.

◆ ff_hls_demuxer

const FFInputFormat ff_hls_demuxer
Initial value:
= {
.p.name = "hls",
.p.long_name = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming"),
.p.priv_class = &hls_class,
.priv_data_size = sizeof(HLSContext),
.flags_internal = FF_FMT_INIT_CLEANUP,
}

Definition at line 2597 of file hls.c.

AVFMT_NO_BYTE_SEEK
#define AVFMT_NO_BYTE_SEEK
Format does not allow seeking by bytes.
Definition: avformat.h:487
FF_FMT_INIT_CLEANUP
#define FF_FMT_INIT_CLEANUP
For an FFInputFormat with this flag set read_close() needs to be called by the caller upon read_heade...
Definition: internal.h:46
OFFSET
#define OFFSET(x)
Definition: hls.c:2562
hls_close
static int hls_close(AVFormatContext *s)
Definition: hls.c:1912
hls_class
static const AVClass hls_class
Definition: hls.c:2590
read_seek
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
Definition: libcdio.c:151
read_close
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:143
hls_options
static const AVOption hls_options[]
Definition: hls.c:2564
read_packet
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
Definition: avio_read_callback.c:41
FLAGS
#define FLAGS
Definition: hls.c:2563
hls_read_header
static int hls_read_header(AVFormatContext *s)
Definition: hls.c:1929
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
read_header
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:550
NULL
#define NULL
Definition: coverity.c:32
AV_OPT_TYPE_DICT
@ AV_OPT_TYPE_DICT
Definition: opt.h:242
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition: internal.h:106
HLSContext
Definition: hls.c:204
hls_read_seek
static int hls_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Definition: hls.c:2434
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:235
AVFMT_NOGENSEARCH
#define AVFMT_NOGENSEARCH
Format does not allow to fall back on generic search.
Definition: avformat.h:486
hls_probe
static int hls_probe(const AVProbeData *p)
Definition: hls.c:2526
read_probe
static int read_probe(const AVProbeData *p)
Definition: cdg.c:30
AVFMT_TS_DISCONT
#define AVFMT_TS_DISCONT
Format allows timestamp discontinuities.
Definition: avformat.h:481
hls_read_packet
static int hls_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: hls.c:2289
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:251
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Definition: opt.h:239