FFmpeg
Loading...
Searching...
No Matches
hls.c File Reference

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

#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/mem.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)
 
#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 }
 

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 (void *context, const char *key, int key_len, char **dest, int *dest_len)
 
static void handle_key_args (void *context, 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 (void *context, 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 (void *vinfo, 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 is_native_http (AVIOContext *pb)
 
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 test_segment (AVFormatContext *s, const AVInputFormat *in_fmt, struct playlist *pls, struct segment *seg)
 
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 segment_reusable (AVIOContext *in, const struct segment *cur, const struct segment *next)
 
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 read_key (HLSContext *c, struct playlist *pls, struct segment *seg)
 
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 reload_playlist (struct playlist *v, HLSContext *c)
 
static int read_data_continuous (void *opaque, uint8_t *buf, int buf_size)
 
static int read_data_subtitle_segment (void *opaque, uint8_t *buf, int buf_size)
 
static int nested_io_open (AVFormatContext *s, AVIOContext **pb, const char *url, int flags, AVDictionary **opts)
 
static int init_subtitle_context (struct playlist *pls)
 
static int read_subtitle_packet (struct playlist *v, AVPacket *pkt)
 
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 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 metadata_has_changed (const AVDictionary *current, const AVDictionary *update)
 Check whether any entry in update differs from the corresponding entry in current.
 
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 51 of file hls.c.

◆ MAX_FIELD_LEN

#define MAX_FIELD_LEN   64

Definition at line 53 of file hls.c.

◆ MAX_CHARACTERISTICS_LEN

#define MAX_CHARACTERISTICS_LEN   512

Definition at line 54 of file hls.c.

◆ MPEG_TIME_BASE

#define MPEG_TIME_BASE   90000

Definition at line 56 of file hls.c.

Referenced by set_stream_info_from_input_stream().

◆ MPEG_TIME_BASE_Q

#define MPEG_TIME_BASE_Q   (AVRational){1, MPEG_TIME_BASE}

◆ OFFSET

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

Definition at line 3128 of file hls.c.

◆ FLAGS

#define FLAGS   AV_OPT_FLAG_DECODING_PARAM

Definition at line 3129 of file hls.c.

Enumeration Type Documentation

◆ KeyType

enum KeyType
Enumerator
KEY_NONE 
KEY_AES_128 
KEY_SAMPLE_AES 

Definition at line 71 of file hls.c.

◆ PlaylistType

Enumerator
PLS_TYPE_UNSPECIFIED 
PLS_TYPE_EVENT 
PLS_TYPE_VOD 

Definition at line 91 of file hls.c.

Function Documentation

◆ free_segment_dynarray()

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

Definition at line 253 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 263 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 270 of file hls.c.

Referenced by free_playlist_list().

◆ free_playlist_list()

static void free_playlist_list ( HLSContext * c)
static

Definition at line 282 of file hls.c.

Referenced by hls_close().

◆ free_variant_list()

static void free_variant_list ( HLSContext * c)
static

Definition at line 313 of file hls.c.

Referenced by hls_close().

◆ free_rendition_list()

static void free_rendition_list ( HLSContext * c)
static

Definition at line 325 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 334 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 378 of file hls.c.

Referenced by ensure_playlist(), and parse_playlist().

◆ handle_variant_args()

static void handle_variant_args ( void * context,
const char * key,
int key_len,
char ** dest,
int * dest_len )
static

Definition at line 404 of file hls.c.

Referenced by parse_playlist().

◆ handle_key_args()

static void handle_key_args ( void * context,
const char * key,
int key_len,
char ** dest,
int * dest_len )
static

Definition at line 429 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 450 of file hls.c.

Referenced by parse_playlist().

◆ handle_init_section_args()

static void handle_init_section_args ( void * context,
const char * key,
int key_len,
char ** dest,
int * dest_len )
static

Definition at line 499 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 524 of file hls.c.

Referenced by parse_playlist().

◆ handle_rendition_args()

static void handle_rendition_args ( void * vinfo,
const char * key,
int key_len,
char ** dest,
int * dest_len )
static

Definition at line 611 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 657 of file hls.c.

Referenced by parse_playlist().

◆ is_native_http()

static int is_native_http ( AVIOContext * pb)
static

Definition at line 667 of file hls.c.

Referenced by open_url(), parse_playlist(), and read_data_continuous().

◆ open_url_keepalive()

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

Definition at line 677 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 695 of file hls.c.

Referenced by open_input(), parse_playlist(), and read_key().

◆ test_segment()

static int test_segment ( AVFormatContext * s,
const AVInputFormat * in_fmt,
struct playlist * pls,
struct segment * seg )
static

Definition at line 783 of file hls.c.

Referenced by hls_read_header(), and parse_playlist().

◆ parse_playlist()

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

Definition at line 830 of file hls.c.

Referenced by hls_read_header(), hls_read_seek(), reload_playlist(), and select_cur_seq_no().

◆ current_segment()

static struct segment * current_segment ( struct playlist * pls)
static

◆ next_segment()

static struct segment * next_segment ( struct playlist * pls)
static

Definition at line 1196 of file hls.c.

Referenced by read_data_continuous().

◆ segment_reusable()

static int segment_reusable ( AVIOContext * in,
const struct segment * cur,
const struct segment * next )
static

Definition at line 1207 of file hls.c.

Referenced by read_data_continuous().

◆ read_from_url()

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

◆ 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 1236 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 1265 of file hls.c.

Referenced by handle_id3().

◆ handle_id3()

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

Definition at line 1294 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 1336 of file hls.c.

Referenced by read_data_continuous().

◆ read_key()

static int read_key ( HLSContext * c,
struct playlist * pls,
struct segment * seg )
static

Definition at line 1436 of file hls.c.

◆ open_input()

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

Definition at line 1467 of file hls.c.

Referenced by read_data_continuous(), read_data_subtitle_segment(), and update_init_section().

◆ update_init_section()

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

Definition at line 1574 of file hls.c.

Referenced by read_data_continuous().

◆ default_reload_interval()

static int64_t default_reload_interval ( struct playlist * pls)
static

Definition at line 1631 of file hls.c.

Referenced by hls_read_seek(), reload_playlist(), and select_cur_seq_no().

◆ playlist_needed()

static int playlist_needed ( struct playlist * pls)
static

Definition at line 1638 of file hls.c.

Referenced by recheck_discard_flags(), and reload_playlist().

◆ reload_playlist()

static int reload_playlist ( struct playlist * v,
HLSContext * c )
static

Definition at line 1684 of file hls.c.

Referenced by read_data_continuous(), and read_subtitle_packet().

◆ read_data_continuous()

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

Definition at line 1761 of file hls.c.

Referenced by hls_read_header().

◆ read_data_subtitle_segment()

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

Definition at line 1888 of file hls.c.

Referenced by init_subtitle_context().

◆ nested_io_open()

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

Definition at line 1917 of file hls.c.

◆ init_subtitle_context()

static int init_subtitle_context ( struct playlist * pls)
static

Definition at line 1927 of file hls.c.

Referenced by read_subtitle_packet().

◆ read_subtitle_packet()

static int read_subtitle_packet ( struct playlist * v,
AVPacket * pkt )
static

Definition at line 1962 of file hls.c.

Referenced by hls_read_packet().

◆ 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 1994 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 2018 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 2050 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 2089 of file hls.c.

Referenced by hls_read_header(), and recheck_discard_flags().

◆ add_stream_to_programs()

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

Definition at line 2164 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 2190 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 2214 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 2255 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 2276 of file hls.c.

◆ hls_read_header()

static int hls_read_header ( AVFormatContext * s)
static

Definition at line 2293 of file hls.c.

◆ recheck_discard_flags()

static int recheck_discard_flags ( AVFormatContext * s,
int first )
static

Definition at line 2614 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 2659 of file hls.c.

Referenced by hls_read_packet().

◆ get_timebase()

static AVRational get_timebase ( struct playlist * pls)
static

Definition at line 2684 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 2692 of file hls.c.

Referenced by hls_read_packet().

◆ metadata_has_changed()

static int metadata_has_changed ( const AVDictionary * current,
const AVDictionary * update )
static

Check whether any entry in update differs from the corresponding entry in current.

HLS segments can repeat timed ID3 metadata in every segment so that listeners joining mid-stream immediately receive the current track information. Only signal a metadata change when values actually differ to avoid spurious updates on every segment boundary.

Definition at line 2710 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 2724 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 2934 of file hls.c.

◆ hls_probe()

static int hls_probe ( const AVProbeData * p)
static

Definition at line 3092 of file hls.c.

Variable Documentation

◆ hls_options

const AVOption hls_options[]
static

Definition at line 3130 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,
}
const char * av_default_item_name(void *ptr)
Return the context name.
Definition log.c:241
#define LIBAVUTIL_VERSION_INT
Definition version.h:85
static const AVOption hls_options[]
Definition hls.c:3130

Definition at line 3171 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_INFMT_FLAG_INIT_CLEANUP,
}
#define AVFMT_TS_DISCONT
Format allows timestamp discontinuities.
Definition avformat.h:500
#define AVFMT_NO_BYTE_SEEK
Format does not allow seeking by bytes.
Definition avformat.h:506
#define AVFMT_NOGENSEARCH
Format does not allow to fall back on generic search.
Definition avformat.h:505
#define AVFMT_SHOW_IDS
Show format stream IDs numbers.
Definition avformat.h:496
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
static int read_probe(const AVProbeData *p)
Definition cdg.c:30
#define FF_INFMT_FLAG_INIT_CLEANUP
For an FFInputFormat with this flag set read_close() needs to be called by the caller upon read_heade...
Definition demux.h:35
static int read_header(FFV1Context *f, RangeCoder *c)
Definition ffv1dec.c:578
static int hls_read_header(AVFormatContext *s)
Definition hls.c:2293
static int hls_probe(const AVProbeData *p)
Definition hls.c:3092
static int hls_close(AVFormatContext *s)
Definition hls.c:2276
static int hls_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition hls.c:2724
static const AVClass hls_class
Definition hls.c:3171
static int hls_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Definition hls.c:2934
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
static av_cold int read_close(AVFormatContext *ctx)
Definition libcdio.c:143
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
Definition libcdio.c:151

Definition at line 3178 of file hls.c.