FFmpeg
hls.c
Go to the documentation of this file.
1 /*
2  * Apple HTTP Live Streaming demuxer
3  * Copyright (c) 2010 Martin Storsjo
4  * Copyright (c) 2013 Anssi Hannula
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 /**
24  * @file
25  * Apple HTTP Live Streaming demuxer
26  * https://www.rfc-editor.org/rfc/rfc8216.txt
27  */
28 
29 #include "libavformat/http.h"
30 #include "libavutil/avstring.h"
31 #include "libavutil/avassert.h"
32 #include "libavutil/intreadwrite.h"
33 #include "libavutil/mathematics.h"
34 #include "libavutil/opt.h"
35 #include "libavutil/dict.h"
36 #include "libavutil/time.h"
37 #include "avformat.h"
38 #include "internal.h"
39 #include "avio_internal.h"
40 #include "id3v2.h"
41 
42 #define INITIAL_BUFFER_SIZE 32768
43 
44 #define MAX_FIELD_LEN 64
45 #define MAX_CHARACTERISTICS_LEN 512
46 
47 #define MPEG_TIME_BASE 90000
48 #define MPEG_TIME_BASE_Q (AVRational){1, MPEG_TIME_BASE}
49 
50 /*
51  * An apple http stream consists of a playlist with media segment files,
52  * played sequentially. There may be several playlists with the same
53  * video content, in different bandwidth variants, that are played in
54  * parallel (preferably only one bandwidth variant at a time). In this case,
55  * the user supplied the url to a main playlist that only lists the variant
56  * playlists.
57  *
58  * If the main playlist doesn't point at any variants, we still create
59  * one anonymous toplevel variant for this, to maintain the structure.
60  */
61 
62 enum KeyType {
66 };
67 
68 struct segment {
69  int64_t duration;
70  int64_t url_offset;
71  int64_t size;
72  char *url;
73  char *key;
75  uint8_t iv[16];
76  /* associated Media Initialization Section, treated as a segment */
78 };
79 
80 struct rendition;
81 
86 };
87 
88 /*
89  * Each playlist has its own demuxer. If it currently is active,
90  * it has an open AVIOContext too, and potentially an AVPacket
91  * containing the next packet from this stream.
92  */
93 struct playlist {
102  int index;
106 
107  /* main demuxer streams associated with this playlist
108  * indexed by the subdemuxer stream indexes */
111 
112  int finished;
115  int64_t start_seq_no;
117  struct segment **segments;
118  int needed;
119  int broken;
120  int64_t cur_seq_no;
121  int64_t last_seq_no;
123  int64_t cur_seg_offset;
124  int64_t last_load_time;
125 
126  /* Currently active Media Initialization Section */
129  unsigned int init_sec_buf_size;
130  unsigned int init_sec_data_len;
132 
135 
136  /* ID3 timestamp handling (elementary audio streams have ID3 timestamps
137  * (and possibly other ID3 tags) in the beginning of each segment) */
138  int is_id3_timestamped; /* -1: not yet known */
139  int64_t id3_mpegts_timestamp; /* in mpegts tb */
140  int64_t id3_offset; /* in stream original tb */
141  uint8_t* id3_buf; /* temp buffer for id3 parsing */
142  unsigned int id3_buf_size;
143  AVDictionary *id3_initial; /* data from first id3 tag */
144  int id3_found; /* ID3 tag found at some point */
145  int id3_changed; /* ID3 tag data has changed at some point */
146  ID3v2ExtraMeta *id3_deferred_extra; /* stored here until subdemuxer is opened */
147 
148  int64_t seek_timestamp;
150  int seek_stream_index; /* into subdemuxer stream array */
151 
152  /* Renditions associated with this playlist, if any.
153  * Alternative rendition playlists have a single rendition associated
154  * with them, and variant main Media Playlists may have
155  * multiple (playlist-less) renditions associated with them. */
158 
159  /* Media Initialization Sections (EXT-X-MAP) associated with this
160  * playlist, if any. */
163 };
164 
165 /*
166  * Renditions are e.g. alternative subtitle or audio streams.
167  * The rendition may either be an external playlist or it may be
168  * contained in the main Media Playlist of the variant (in which case
169  * playlist is NULL).
170  */
171 struct rendition {
178 };
179 
180 struct variant {
182 
183  /* every variant contains at least the main Media Playlist in index 0 */
185  struct playlist **playlists;
186 
190 };
191 
192 typedef struct HLSContext {
193  AVClass *class;
196  struct variant **variants;
198  struct playlist **playlists;
201 
202  int64_t cur_seq_no;
207  int64_t cur_timestamp;
216 } HLSContext;
217 
218 static void free_segment_dynarray(struct segment **segments, int n_segments)
219 {
220  int i;
221  for (i = 0; i < n_segments; i++) {
222  av_freep(&segments[i]->key);
223  av_freep(&segments[i]->url);
224  av_freep(&segments[i]);
225  }
226 }
227 
228 static void free_segment_list(struct playlist *pls)
229 {
231  av_freep(&pls->segments);
232  pls->n_segments = 0;
233 }
234 
235 static void free_init_section_list(struct playlist *pls)
236 {
237  int i;
238  for (i = 0; i < pls->n_init_sections; i++) {
239  av_freep(&pls->init_sections[i]->url);
240  av_freep(&pls->init_sections[i]);
241  }
242  av_freep(&pls->init_sections);
243  pls->n_init_sections = 0;
244 }
245 
247 {
248  int i;
249  for (i = 0; i < c->n_playlists; i++) {
250  struct playlist *pls = c->playlists[i];
251  free_segment_list(pls);
253  av_freep(&pls->main_streams);
254  av_freep(&pls->renditions);
255  av_freep(&pls->id3_buf);
256  av_dict_free(&pls->id3_initial);
258  av_freep(&pls->init_sec_buf);
259  av_packet_free(&pls->pkt);
260  av_freep(&pls->pb.buffer);
261  ff_format_io_close(c->ctx, &pls->input);
262  pls->input_read_done = 0;
263  ff_format_io_close(c->ctx, &pls->input_next);
264  pls->input_next_requested = 0;
265  if (pls->ctx) {
266  pls->ctx->pb = NULL;
267  avformat_close_input(&pls->ctx);
268  }
269  av_free(pls);
270  }
271  av_freep(&c->playlists);
272  c->n_playlists = 0;
273 }
274 
276 {
277  int i;
278  for (i = 0; i < c->n_variants; i++) {
279  struct variant *var = c->variants[i];
280  av_freep(&var->playlists);
281  av_free(var);
282  }
283  av_freep(&c->variants);
284  c->n_variants = 0;
285 }
286 
288 {
289  int i;
290  for (i = 0; i < c->n_renditions; i++)
291  av_freep(&c->renditions[i]);
292  av_freep(&c->renditions);
293  c->n_renditions = 0;
294 }
295 
296 static struct playlist *new_playlist(HLSContext *c, const char *url,
297  const char *base)
298 {
299  struct playlist *pls = av_mallocz(sizeof(struct playlist));
300  if (!pls)
301  return NULL;
302  pls->pkt = av_packet_alloc();
303  if (!pls->pkt) {
304  av_free(pls);
305  return NULL;
306  }
307  ff_make_absolute_url(pls->url, sizeof(pls->url), base, url);
308  if (!pls->url[0]) {
309  av_packet_free(&pls->pkt);
310  av_free(pls);
311  return NULL;
312  }
314 
315  pls->is_id3_timestamped = -1;
317 
318  dynarray_add(&c->playlists, &c->n_playlists, pls);
319  return pls;
320 }
321 
322 struct variant_info {
323  char bandwidth[20];
324  /* variant group ids: */
328 };
329 
330 static struct variant *new_variant(HLSContext *c, struct variant_info *info,
331  const char *url, const char *base)
332 {
333  struct variant *var;
334  struct playlist *pls;
335 
336  pls = new_playlist(c, url, base);
337  if (!pls)
338  return NULL;
339 
340  var = av_mallocz(sizeof(struct variant));
341  if (!var)
342  return NULL;
343 
344  if (info) {
345  var->bandwidth = atoi(info->bandwidth);
346  strcpy(var->audio_group, info->audio);
347  strcpy(var->video_group, info->video);
348  strcpy(var->subtitles_group, info->subtitles);
349  }
350 
351  dynarray_add(&c->variants, &c->n_variants, var);
352  dynarray_add(&var->playlists, &var->n_playlists, pls);
353  return var;
354 }
355 
356 static void handle_variant_args(struct variant_info *info, const char *key,
357  int key_len, char **dest, int *dest_len)
358 {
359  if (!strncmp(key, "BANDWIDTH=", key_len)) {
360  *dest = info->bandwidth;
361  *dest_len = sizeof(info->bandwidth);
362  } else if (!strncmp(key, "AUDIO=", key_len)) {
363  *dest = info->audio;
364  *dest_len = sizeof(info->audio);
365  } else if (!strncmp(key, "VIDEO=", key_len)) {
366  *dest = info->video;
367  *dest_len = sizeof(info->video);
368  } else if (!strncmp(key, "SUBTITLES=", key_len)) {
369  *dest = info->subtitles;
370  *dest_len = sizeof(info->subtitles);
371  }
372 }
373 
374 struct key_info {
376  char method[11];
377  char iv[35];
378 };
379 
380 static void handle_key_args(struct key_info *info, const char *key,
381  int key_len, char **dest, int *dest_len)
382 {
383  if (!strncmp(key, "METHOD=", key_len)) {
384  *dest = info->method;
385  *dest_len = sizeof(info->method);
386  } else if (!strncmp(key, "URI=", key_len)) {
387  *dest = info->uri;
388  *dest_len = sizeof(info->uri);
389  } else if (!strncmp(key, "IV=", key_len)) {
390  *dest = info->iv;
391  *dest_len = sizeof(info->iv);
392  }
393 }
394 
397  char byterange[32];
398 };
399 
400 static struct segment *new_init_section(struct playlist *pls,
401  struct init_section_info *info,
402  const char *url_base)
403 {
404  struct segment *sec;
405  char tmp_str[MAX_URL_SIZE], *ptr = tmp_str;
406 
407  if (!info->uri[0])
408  return NULL;
409 
410  sec = av_mallocz(sizeof(*sec));
411  if (!sec)
412  return NULL;
413 
414  if (!av_strncasecmp(info->uri, "data:", 5)) {
415  ptr = info->uri;
416  } else {
417  ff_make_absolute_url(tmp_str, sizeof(tmp_str), url_base, info->uri);
418  if (!tmp_str[0]) {
419  av_free(sec);
420  return NULL;
421  }
422  }
423  sec->url = av_strdup(ptr);
424  if (!sec->url) {
425  av_free(sec);
426  return NULL;
427  }
428 
429  if (info->byterange[0]) {
430  sec->size = strtoll(info->byterange, NULL, 10);
431  ptr = strchr(info->byterange, '@');
432  if (ptr)
433  sec->url_offset = strtoll(ptr+1, NULL, 10);
434  } else {
435  /* the entire file is the init section */
436  sec->size = -1;
437  }
438 
439  dynarray_add(&pls->init_sections, &pls->n_init_sections, sec);
440 
441  return sec;
442 }
443 
444 static void handle_init_section_args(struct init_section_info *info, const char *key,
445  int key_len, char **dest, int *dest_len)
446 {
447  if (!strncmp(key, "URI=", key_len)) {
448  *dest = info->uri;
449  *dest_len = sizeof(info->uri);
450  } else if (!strncmp(key, "BYTERANGE=", key_len)) {
451  *dest = info->byterange;
452  *dest_len = sizeof(info->byterange);
453  }
454 }
455 
457  char type[16];
463  char defaultr[4];
464  char forced[4];
466 };
467 
469  const char *url_base)
470 {
471  struct rendition *rend;
473  char *characteristic;
474  char *chr_ptr;
475  char *saveptr;
476 
477  if (!strcmp(info->type, "AUDIO"))
479  else if (!strcmp(info->type, "VIDEO"))
481  else if (!strcmp(info->type, "SUBTITLES"))
483  else if (!strcmp(info->type, "CLOSED-CAPTIONS"))
484  /* CLOSED-CAPTIONS is ignored since we do not support CEA-608 CC in
485  * AVC SEI RBSP anyway */
486  return NULL;
487 
488  if (type == AVMEDIA_TYPE_UNKNOWN) {
489  av_log(c->ctx, AV_LOG_WARNING, "Can't support the type: %s\n", info->type);
490  return NULL;
491  }
492 
493  /* URI is mandatory for subtitles as per spec */
494  if (type == AVMEDIA_TYPE_SUBTITLE && !info->uri[0]) {
495  av_log(c->ctx, AV_LOG_ERROR, "The URI tag is REQUIRED for subtitle.\n");
496  return NULL;
497  }
498 
499  /* TODO: handle subtitles (each segment has to parsed separately) */
500  if (c->ctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL)
501  if (type == AVMEDIA_TYPE_SUBTITLE) {
502  av_log(c->ctx, AV_LOG_WARNING, "Can't support the subtitle(uri: %s)\n", info->uri);
503  return NULL;
504  }
505 
506  rend = av_mallocz(sizeof(struct rendition));
507  if (!rend)
508  return NULL;
509 
510  dynarray_add(&c->renditions, &c->n_renditions, rend);
511 
512  rend->type = type;
513  strcpy(rend->group_id, info->group_id);
514  strcpy(rend->language, info->language);
515  strcpy(rend->name, info->name);
516 
517  /* add the playlist if this is an external rendition */
518  if (info->uri[0]) {
519  rend->playlist = new_playlist(c, info->uri, url_base);
520  if (rend->playlist)
522  &rend->playlist->n_renditions, rend);
523  }
524 
525  if (info->assoc_language[0]) {
526  int langlen = strlen(rend->language);
527  if (langlen < sizeof(rend->language) - 3) {
528  rend->language[langlen] = ',';
529  strncpy(rend->language + langlen + 1, info->assoc_language,
530  sizeof(rend->language) - langlen - 2);
531  }
532  }
533 
534  if (!strcmp(info->defaultr, "YES"))
536  if (!strcmp(info->forced, "YES"))
538 
539  chr_ptr = info->characteristics;
540  while ((characteristic = av_strtok(chr_ptr, ",", &saveptr))) {
541  if (!strcmp(characteristic, "public.accessibility.describes-music-and-sound"))
543  else if (!strcmp(characteristic, "public.accessibility.describes-video"))
545 
546  chr_ptr = NULL;
547  }
548 
549  return rend;
550 }
551 
552 static void handle_rendition_args(struct rendition_info *info, const char *key,
553  int key_len, char **dest, int *dest_len)
554 {
555  if (!strncmp(key, "TYPE=", key_len)) {
556  *dest = info->type;
557  *dest_len = sizeof(info->type);
558  } else if (!strncmp(key, "URI=", key_len)) {
559  *dest = info->uri;
560  *dest_len = sizeof(info->uri);
561  } else if (!strncmp(key, "GROUP-ID=", key_len)) {
562  *dest = info->group_id;
563  *dest_len = sizeof(info->group_id);
564  } else if (!strncmp(key, "LANGUAGE=", key_len)) {
565  *dest = info->language;
566  *dest_len = sizeof(info->language);
567  } else if (!strncmp(key, "ASSOC-LANGUAGE=", key_len)) {
568  *dest = info->assoc_language;
569  *dest_len = sizeof(info->assoc_language);
570  } else if (!strncmp(key, "NAME=", key_len)) {
571  *dest = info->name;
572  *dest_len = sizeof(info->name);
573  } else if (!strncmp(key, "DEFAULT=", key_len)) {
574  *dest = info->defaultr;
575  *dest_len = sizeof(info->defaultr);
576  } else if (!strncmp(key, "FORCED=", key_len)) {
577  *dest = info->forced;
578  *dest_len = sizeof(info->forced);
579  } else if (!strncmp(key, "CHARACTERISTICS=", key_len)) {
580  *dest = info->characteristics;
581  *dest_len = sizeof(info->characteristics);
582  }
583  /*
584  * ignored:
585  * - AUTOSELECT: client may autoselect based on e.g. system language
586  * - INSTREAM-ID: EIA-608 closed caption number ("CC1".."CC4")
587  */
588 }
589 
590 /* used by parse_playlist to allocate a new variant+playlist when the
591  * playlist is detected to be a Media Playlist (not Master Playlist)
592  * and we have no parent Master Playlist (parsing of which would have
593  * allocated the variant and playlist already)
594  * *pls == NULL => Master Playlist or parentless Media Playlist
595  * *pls != NULL => parented Media Playlist, playlist+variant allocated */
596 static int ensure_playlist(HLSContext *c, struct playlist **pls, const char *url)
597 {
598  if (*pls)
599  return 0;
600  if (!new_variant(c, NULL, url, NULL))
601  return AVERROR(ENOMEM);
602  *pls = c->playlists[c->n_playlists - 1];
603  return 0;
604 }
605 
607  const char *url, AVDictionary **options)
608 {
609 #if !CONFIG_HTTP_PROTOCOL
611 #else
612  int ret;
613  URLContext *uc = ffio_geturlcontext(*pb);
614  av_assert0(uc);
615  (*pb)->eof_reached = 0;
616  ret = ff_http_do_new_request2(uc, url, options);
617  if (ret < 0) {
618  ff_format_io_close(s, pb);
619  }
620  return ret;
621 #endif
622 }
623 
624 static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url,
625  AVDictionary **opts, AVDictionary *opts2, int *is_http_out)
626 {
627  HLSContext *c = s->priv_data;
628  AVDictionary *tmp = NULL;
629  const char *proto_name = NULL;
630  int ret;
631  int is_http = 0;
632 
633  if (av_strstart(url, "crypto", NULL)) {
634  if (url[6] == '+' || url[6] == ':')
635  proto_name = avio_find_protocol_name(url + 7);
636  } else if (av_strstart(url, "data", NULL)) {
637  if (url[4] == '+' || url[4] == ':')
638  proto_name = avio_find_protocol_name(url + 5);
639  }
640 
641  if (!proto_name)
642  proto_name = avio_find_protocol_name(url);
643 
644  if (!proto_name)
645  return AVERROR_INVALIDDATA;
646 
647  // only http(s) & file are allowed
648  if (av_strstart(proto_name, "file", NULL)) {
649  if (strcmp(c->allowed_extensions, "ALL") && !av_match_ext(url, c->allowed_extensions)) {
651  "Filename extension of \'%s\' is not a common multimedia extension, blocked for security reasons.\n"
652  "If you wish to override this adjust allowed_extensions, you can set it to \'ALL\' to allow all\n",
653  url);
654  return AVERROR_INVALIDDATA;
655  }
656  } else if (av_strstart(proto_name, "http", NULL)) {
657  is_http = 1;
658  } else if (av_strstart(proto_name, "data", NULL)) {
659  ;
660  } else
661  return AVERROR_INVALIDDATA;
662 
663  if (!strncmp(proto_name, url, strlen(proto_name)) && url[strlen(proto_name)] == ':')
664  ;
665  else if (av_strstart(url, "crypto", NULL) && !strncmp(proto_name, url + 7, strlen(proto_name)) && url[7 + strlen(proto_name)] == ':')
666  ;
667  else if (av_strstart(url, "data", NULL) && !strncmp(proto_name, url + 5, strlen(proto_name)) && url[5 + strlen(proto_name)] == ':')
668  ;
669  else if (strcmp(proto_name, "file") || !strncmp(url, "file,", 5))
670  return AVERROR_INVALIDDATA;
671 
672  av_dict_copy(&tmp, *opts, 0);
673  av_dict_copy(&tmp, opts2, 0);
674 
675  if (is_http && c->http_persistent && *pb) {
676  ret = open_url_keepalive(c->ctx, pb, url, &tmp);
677  if (ret == AVERROR_EXIT) {
678  av_dict_free(&tmp);
679  return ret;
680  } else if (ret < 0) {
681  if (ret != AVERROR_EOF)
683  "keepalive request failed for '%s' with error: '%s' when opening url, retrying with new connection\n",
684  url, av_err2str(ret));
685  av_dict_copy(&tmp, *opts, 0);
686  av_dict_copy(&tmp, opts2, 0);
687  ret = s->io_open(s, pb, url, AVIO_FLAG_READ, &tmp);
688  }
689  } else {
690  ret = s->io_open(s, pb, url, AVIO_FLAG_READ, &tmp);
691  }
692  if (ret >= 0) {
693  // update cookies on http response with setcookies.
694  char *new_cookies = NULL;
695 
696  if (!(s->flags & AVFMT_FLAG_CUSTOM_IO))
697  av_opt_get(*pb, "cookies", AV_OPT_SEARCH_CHILDREN, (uint8_t**)&new_cookies);
698 
699  if (new_cookies)
700  av_dict_set(opts, "cookies", new_cookies, AV_DICT_DONT_STRDUP_VAL);
701  }
702 
703  av_dict_free(&tmp);
704 
705  if (is_http_out)
706  *is_http_out = is_http;
707 
708  return ret;
709 }
710 
711 static int parse_playlist(HLSContext *c, const char *url,
712  struct playlist *pls, AVIOContext *in)
713 {
714  int ret = 0, is_segment = 0, is_variant = 0;
715  int64_t duration = 0;
716  enum KeyType key_type = KEY_NONE;
717  uint8_t iv[16] = "";
718  int has_iv = 0;
719  char key[MAX_URL_SIZE] = "";
720  char line[MAX_URL_SIZE];
721  const char *ptr;
722  int close_in = 0;
723  int64_t seg_offset = 0;
724  int64_t seg_size = -1;
725  uint8_t *new_url = NULL;
726  struct variant_info variant_info;
727  char tmp_str[MAX_URL_SIZE];
728  struct segment *cur_init_section = NULL;
729  int is_http = av_strstart(url, "http", NULL);
730  struct segment **prev_segments = NULL;
731  int prev_n_segments = 0;
732  int64_t prev_start_seq_no = -1;
733 
734  if (is_http && !in && c->http_persistent && c->playlist_pb) {
735  in = c->playlist_pb;
736  ret = open_url_keepalive(c->ctx, &c->playlist_pb, url, NULL);
737  if (ret == AVERROR_EXIT) {
738  return ret;
739  } else if (ret < 0) {
740  if (ret != AVERROR_EOF)
741  av_log(c->ctx, AV_LOG_WARNING,
742  "keepalive request failed for '%s' with error: '%s' when parsing playlist\n",
743  url, av_err2str(ret));
744  in = NULL;
745  }
746  }
747 
748  if (!in) {
750  av_dict_copy(&opts, c->avio_opts, 0);
751 
752  if (c->http_persistent)
753  av_dict_set(&opts, "multiple_requests", "1", 0);
754 
755  ret = c->ctx->io_open(c->ctx, &in, url, AVIO_FLAG_READ, &opts);
756  av_dict_free(&opts);
757  if (ret < 0)
758  return ret;
759 
760  if (is_http && c->http_persistent)
761  c->playlist_pb = in;
762  else
763  close_in = 1;
764  }
765 
766  if (av_opt_get(in, "location", AV_OPT_SEARCH_CHILDREN, &new_url) >= 0)
767  url = new_url;
768 
769  ff_get_chomp_line(in, line, sizeof(line));
770  if (strcmp(line, "#EXTM3U")) {
772  goto fail;
773  }
774 
775  if (pls) {
776  prev_start_seq_no = pls->start_seq_no;
777  prev_segments = pls->segments;
778  prev_n_segments = pls->n_segments;
779  pls->segments = NULL;
780  pls->n_segments = 0;
781 
782  pls->finished = 0;
783  pls->type = PLS_TYPE_UNSPECIFIED;
784  }
785  while (!avio_feof(in)) {
786  ff_get_chomp_line(in, line, sizeof(line));
787  if (av_strstart(line, "#EXT-X-STREAM-INF:", &ptr)) {
788  is_variant = 1;
789  memset(&variant_info, 0, sizeof(variant_info));
791  &variant_info);
792  } else if (av_strstart(line, "#EXT-X-KEY:", &ptr)) {
793  struct key_info info = {{0}};
795  &info);
796  key_type = KEY_NONE;
797  has_iv = 0;
798  if (!strcmp(info.method, "AES-128"))
799  key_type = KEY_AES_128;
800  if (!strcmp(info.method, "SAMPLE-AES"))
801  key_type = KEY_SAMPLE_AES;
802  if (!strncmp(info.iv, "0x", 2) || !strncmp(info.iv, "0X", 2)) {
803  ff_hex_to_data(iv, info.iv + 2);
804  has_iv = 1;
805  }
806  av_strlcpy(key, info.uri, sizeof(key));
807  } else if (av_strstart(line, "#EXT-X-MEDIA:", &ptr)) {
808  struct rendition_info info = {{0}};
810  &info);
811  new_rendition(c, &info, url);
812  } else if (av_strstart(line, "#EXT-X-TARGETDURATION:", &ptr)) {
813  int64_t t;
814  ret = ensure_playlist(c, &pls, url);
815  if (ret < 0)
816  goto fail;
817  t = strtoll(ptr, NULL, 10);
818  if (t < 0 || t >= INT64_MAX / AV_TIME_BASE) {
820  goto fail;
821  }
822  pls->target_duration = t * AV_TIME_BASE;
823  } else if (av_strstart(line, "#EXT-X-MEDIA-SEQUENCE:", &ptr)) {
824  uint64_t seq_no;
825  ret = ensure_playlist(c, &pls, url);
826  if (ret < 0)
827  goto fail;
828  seq_no = strtoull(ptr, NULL, 10);
829  if (seq_no > INT64_MAX) {
830  av_log(c->ctx, AV_LOG_DEBUG, "MEDIA-SEQUENCE higher than "
831  "INT64_MAX, mask out the highest bit\n");
832  seq_no &= INT64_MAX;
833  }
834  pls->start_seq_no = seq_no;
835  } else if (av_strstart(line, "#EXT-X-PLAYLIST-TYPE:", &ptr)) {
836  ret = ensure_playlist(c, &pls, url);
837  if (ret < 0)
838  goto fail;
839  if (!strcmp(ptr, "EVENT"))
840  pls->type = PLS_TYPE_EVENT;
841  else if (!strcmp(ptr, "VOD"))
842  pls->type = PLS_TYPE_VOD;
843  } else if (av_strstart(line, "#EXT-X-MAP:", &ptr)) {
844  struct init_section_info info = {{0}};
845  ret = ensure_playlist(c, &pls, url);
846  if (ret < 0)
847  goto fail;
849  &info);
850  cur_init_section = new_init_section(pls, &info, url);
851  cur_init_section->key_type = key_type;
852  if (has_iv) {
853  memcpy(cur_init_section->iv, iv, sizeof(iv));
854  } else {
855  int64_t seq = pls->start_seq_no + pls->n_segments;
856  memset(cur_init_section->iv, 0, sizeof(cur_init_section->iv));
857  AV_WB64(cur_init_section->iv + 8, seq);
858  }
859 
860  if (key_type != KEY_NONE) {
861  ff_make_absolute_url(tmp_str, sizeof(tmp_str), url, key);
862  if (!tmp_str[0]) {
863  av_free(cur_init_section);
865  goto fail;
866  }
867  cur_init_section->key = av_strdup(tmp_str);
868  if (!cur_init_section->key) {
869  av_free(cur_init_section);
870  ret = AVERROR(ENOMEM);
871  goto fail;
872  }
873  } else {
874  cur_init_section->key = NULL;
875  }
876 
877  } else if (av_strstart(line, "#EXT-X-ENDLIST", &ptr)) {
878  if (pls)
879  pls->finished = 1;
880  } else if (av_strstart(line, "#EXTINF:", &ptr)) {
881  is_segment = 1;
882  duration = atof(ptr) * AV_TIME_BASE;
883  } else if (av_strstart(line, "#EXT-X-BYTERANGE:", &ptr)) {
884  seg_size = strtoll(ptr, NULL, 10);
885  ptr = strchr(ptr, '@');
886  if (ptr)
887  seg_offset = strtoll(ptr+1, NULL, 10);
888  } else if (av_strstart(line, "#", NULL)) {
889  av_log(c->ctx, AV_LOG_INFO, "Skip ('%s')\n", line);
890  continue;
891  } else if (line[0]) {
892  if (is_variant) {
893  if (!new_variant(c, &variant_info, line, url)) {
894  ret = AVERROR(ENOMEM);
895  goto fail;
896  }
897  is_variant = 0;
898  }
899  if (is_segment) {
900  struct segment *seg;
901  ret = ensure_playlist(c, &pls, url);
902  if (ret < 0)
903  goto fail;
904  seg = av_malloc(sizeof(struct segment));
905  if (!seg) {
906  ret = AVERROR(ENOMEM);
907  goto fail;
908  }
909  if (has_iv) {
910  memcpy(seg->iv, iv, sizeof(iv));
911  } else {
912  uint64_t seq = pls->start_seq_no + (uint64_t)pls->n_segments;
913  memset(seg->iv, 0, sizeof(seg->iv));
914  AV_WB64(seg->iv + 8, seq);
915  }
916 
917  if (key_type != KEY_NONE) {
918  ff_make_absolute_url(tmp_str, sizeof(tmp_str), url, key);
919  if (!tmp_str[0]) {
921  av_free(seg);
922  goto fail;
923  }
924  seg->key = av_strdup(tmp_str);
925  if (!seg->key) {
926  av_free(seg);
927  ret = AVERROR(ENOMEM);
928  goto fail;
929  }
930  } else {
931  seg->key = NULL;
932  }
933 
934  ff_make_absolute_url(tmp_str, sizeof(tmp_str), url, line);
935  if (!tmp_str[0]) {
937  if (seg->key)
938  av_free(seg->key);
939  av_free(seg);
940  goto fail;
941  }
942  seg->url = av_strdup(tmp_str);
943  if (!seg->url) {
944  av_free(seg->key);
945  av_free(seg);
946  ret = AVERROR(ENOMEM);
947  goto fail;
948  }
949 
950  if (duration < 0.001 * AV_TIME_BASE) {
951  av_log(c->ctx, AV_LOG_WARNING, "Cannot get correct #EXTINF value of segment %s,"
952  " set to default value to 1ms.\n", seg->url);
953  duration = 0.001 * AV_TIME_BASE;
954  }
955  seg->duration = duration;
956  seg->key_type = key_type;
957  dynarray_add(&pls->segments, &pls->n_segments, seg);
958  is_segment = 0;
959 
960  seg->size = seg_size;
961  if (seg_size >= 0) {
962  seg->url_offset = seg_offset;
963  seg_offset += seg_size;
964  seg_size = -1;
965  } else {
966  seg->url_offset = 0;
967  seg_offset = 0;
968  }
969 
970  seg->init_section = cur_init_section;
971  }
972  }
973  }
974  if (prev_segments) {
975  if (pls->start_seq_no > prev_start_seq_no && c->first_timestamp != AV_NOPTS_VALUE) {
976  int64_t prev_timestamp = c->first_timestamp;
977  int i;
978  int64_t diff = pls->start_seq_no - prev_start_seq_no;
979  for (i = 0; i < prev_n_segments && i < diff; i++) {
980  c->first_timestamp += prev_segments[i]->duration;
981  }
982  av_log(c->ctx, AV_LOG_DEBUG, "Media sequence change (%"PRId64" -> %"PRId64")"
983  " reflected in first_timestamp: %"PRId64" -> %"PRId64"\n",
984  prev_start_seq_no, pls->start_seq_no,
985  prev_timestamp, c->first_timestamp);
986  } else if (pls->start_seq_no < prev_start_seq_no) {
987  av_log(c->ctx, AV_LOG_WARNING, "Media sequence changed unexpectedly: %"PRId64" -> %"PRId64"\n",
988  prev_start_seq_no, pls->start_seq_no);
989  }
990  free_segment_dynarray(prev_segments, prev_n_segments);
991  av_freep(&prev_segments);
992  }
993  if (pls)
995 
996 fail:
997  av_free(new_url);
998  if (close_in)
999  ff_format_io_close(c->ctx, &in);
1000  c->ctx->ctx_flags = c->ctx->ctx_flags & ~(unsigned)AVFMTCTX_UNSEEKABLE;
1001  if (!c->n_variants || !c->variants[0]->n_playlists ||
1002  !(c->variants[0]->playlists[0]->finished ||
1003  c->variants[0]->playlists[0]->type == PLS_TYPE_EVENT))
1004  c->ctx->ctx_flags |= AVFMTCTX_UNSEEKABLE;
1005  return ret;
1006 }
1007 
1008 static struct segment *current_segment(struct playlist *pls)
1009 {
1010  return pls->segments[pls->cur_seq_no - pls->start_seq_no];
1011 }
1012 
1013 static struct segment *next_segment(struct playlist *pls)
1014 {
1015  int64_t n = pls->cur_seq_no - pls->start_seq_no + 1;
1016  if (n >= pls->n_segments)
1017  return NULL;
1018  return pls->segments[n];
1019 }
1020 
1021 static int read_from_url(struct playlist *pls, struct segment *seg,
1022  uint8_t *buf, int buf_size)
1023 {
1024  int ret;
1025 
1026  /* limit read if the segment was only a part of a file */
1027  if (seg->size >= 0)
1028  buf_size = FFMIN(buf_size, seg->size - pls->cur_seg_offset);
1029 
1030  ret = avio_read(pls->input, buf, buf_size);
1031  if (ret > 0)
1032  pls->cur_seg_offset += ret;
1033 
1034  return ret;
1035 }
1036 
1037 /* Parse the raw ID3 data and pass contents to caller */
1039  AVDictionary **metadata, int64_t *dts,
1040  ID3v2ExtraMetaAPIC **apic, ID3v2ExtraMeta **extra_meta)
1041 {
1042  static const char id3_priv_owner_ts[] = "com.apple.streaming.transportStreamTimestamp";
1043  ID3v2ExtraMeta *meta;
1044 
1045  ff_id3v2_read_dict(pb, metadata, ID3v2_DEFAULT_MAGIC, extra_meta);
1046  for (meta = *extra_meta; meta; meta = meta->next) {
1047  if (!strcmp(meta->tag, "PRIV")) {
1048  ID3v2ExtraMetaPRIV *priv = &meta->data.priv;
1049  if (priv->datasize == 8 && !strcmp(priv->owner, id3_priv_owner_ts)) {
1050  /* 33-bit MPEG timestamp */
1051  int64_t ts = AV_RB64(priv->data);
1052  av_log(s, AV_LOG_DEBUG, "HLS ID3 audio timestamp %"PRId64"\n", ts);
1053  if ((ts & ~((1ULL << 33) - 1)) == 0)
1054  *dts = ts;
1055  else
1056  av_log(s, AV_LOG_ERROR, "Invalid HLS ID3 audio timestamp %"PRId64"\n", ts);
1057  }
1058  } else if (!strcmp(meta->tag, "APIC") && apic)
1059  *apic = &meta->data.apic;
1060  }
1061 }
1062 
1063 /* Check if the ID3 metadata contents have changed */
1064 static int id3_has_changed_values(struct playlist *pls, AVDictionary *metadata,
1065  ID3v2ExtraMetaAPIC *apic)
1066 {
1067  AVDictionaryEntry *entry = NULL;
1068  AVDictionaryEntry *oldentry;
1069  /* check that no keys have changed values */
1070  while ((entry = av_dict_get(metadata, "", entry, AV_DICT_IGNORE_SUFFIX))) {
1071  oldentry = av_dict_get(pls->id3_initial, entry->key, NULL, AV_DICT_MATCH_CASE);
1072  if (!oldentry || strcmp(oldentry->value, entry->value) != 0)
1073  return 1;
1074  }
1075 
1076  /* check if apic appeared */
1077  if (apic && (pls->ctx->nb_streams != 2 || !pls->ctx->streams[1]->attached_pic.data))
1078  return 1;
1079 
1080  if (apic) {
1081  int size = pls->ctx->streams[1]->attached_pic.size;
1082  if (size != apic->buf->size - AV_INPUT_BUFFER_PADDING_SIZE)
1083  return 1;
1084 
1085  if (memcmp(apic->buf->data, pls->ctx->streams[1]->attached_pic.data, size) != 0)
1086  return 1;
1087  }
1088 
1089  return 0;
1090 }
1091 
1092 /* Parse ID3 data and handle the found data */
1093 static void handle_id3(AVIOContext *pb, struct playlist *pls)
1094 {
1095  AVDictionary *metadata = NULL;
1096  ID3v2ExtraMetaAPIC *apic = NULL;
1097  ID3v2ExtraMeta *extra_meta = NULL;
1098  int64_t timestamp = AV_NOPTS_VALUE;
1099 
1100  parse_id3(pls->ctx, pb, &metadata, &timestamp, &apic, &extra_meta);
1101 
1102  if (timestamp != AV_NOPTS_VALUE) {
1103  pls->id3_mpegts_timestamp = timestamp;
1104  pls->id3_offset = 0;
1105  }
1106 
1107  if (!pls->id3_found) {
1108  /* initial ID3 tags */
1110  pls->id3_found = 1;
1111 
1112  /* get picture attachment and set text metadata */
1113  if (pls->ctx->nb_streams)
1114  ff_id3v2_parse_apic(pls->ctx, extra_meta);
1115  else
1116  /* demuxer not yet opened, defer picture attachment */
1117  pls->id3_deferred_extra = extra_meta;
1118 
1119  ff_id3v2_parse_priv_dict(&metadata, extra_meta);
1120  av_dict_copy(&pls->ctx->metadata, metadata, 0);
1121  pls->id3_initial = metadata;
1122 
1123  } else {
1124  if (!pls->id3_changed && id3_has_changed_values(pls, metadata, apic)) {
1125  avpriv_report_missing_feature(pls->parent, "Changing ID3 metadata in HLS audio elementary stream");
1126  pls->id3_changed = 1;
1127  }
1128  av_dict_free(&metadata);
1129  }
1130 
1131  if (!pls->id3_deferred_extra)
1132  ff_id3v2_free_extra_meta(&extra_meta);
1133 }
1134 
1135 static void intercept_id3(struct playlist *pls, uint8_t *buf,
1136  int buf_size, int *len)
1137 {
1138  /* intercept id3 tags, we do not want to pass them to the raw
1139  * demuxer on all segment switches */
1140  int bytes;
1141  int id3_buf_pos = 0;
1142  int fill_buf = 0;
1143  struct segment *seg = current_segment(pls);
1144 
1145  /* gather all the id3 tags */
1146  while (1) {
1147  /* see if we can retrieve enough data for ID3 header */
1148  if (*len < ID3v2_HEADER_SIZE && buf_size >= ID3v2_HEADER_SIZE) {
1149  bytes = read_from_url(pls, seg, buf + *len, ID3v2_HEADER_SIZE - *len);
1150  if (bytes > 0) {
1151 
1152  if (bytes == ID3v2_HEADER_SIZE - *len)
1153  /* no EOF yet, so fill the caller buffer again after
1154  * we have stripped the ID3 tags */
1155  fill_buf = 1;
1156 
1157  *len += bytes;
1158 
1159  } else if (*len <= 0) {
1160  /* error/EOF */
1161  *len = bytes;
1162  fill_buf = 0;
1163  }
1164  }
1165 
1166  if (*len < ID3v2_HEADER_SIZE)
1167  break;
1168 
1169  if (ff_id3v2_match(buf, ID3v2_DEFAULT_MAGIC)) {
1170  int64_t maxsize = seg->size >= 0 ? seg->size : 1024*1024;
1171  int taglen = ff_id3v2_tag_len(buf);
1172  int tag_got_bytes = FFMIN(taglen, *len);
1173  int remaining = taglen - tag_got_bytes;
1174 
1175  if (taglen > maxsize) {
1176  av_log(pls->parent, AV_LOG_ERROR, "Too large HLS ID3 tag (%d > %"PRId64" bytes)\n",
1177  taglen, maxsize);
1178  break;
1179  }
1180 
1181  /*
1182  * Copy the id3 tag to our temporary id3 buffer.
1183  * We could read a small id3 tag directly without memcpy, but
1184  * we would still need to copy the large tags, and handling
1185  * both of those cases together with the possibility for multiple
1186  * tags would make the handling a bit complex.
1187  */
1188  pls->id3_buf = av_fast_realloc(pls->id3_buf, &pls->id3_buf_size, id3_buf_pos + taglen);
1189  if (!pls->id3_buf)
1190  break;
1191  memcpy(pls->id3_buf + id3_buf_pos, buf, tag_got_bytes);
1192  id3_buf_pos += tag_got_bytes;
1193 
1194  /* strip the intercepted bytes */
1195  *len -= tag_got_bytes;
1196  memmove(buf, buf + tag_got_bytes, *len);
1197  av_log(pls->parent, AV_LOG_DEBUG, "Stripped %d HLS ID3 bytes\n", tag_got_bytes);
1198 
1199  if (remaining > 0) {
1200  /* read the rest of the tag in */
1201  if (read_from_url(pls, seg, pls->id3_buf + id3_buf_pos, remaining) != remaining)
1202  break;
1203  id3_buf_pos += remaining;
1204  av_log(pls->parent, AV_LOG_DEBUG, "Stripped additional %d HLS ID3 bytes\n", remaining);
1205  }
1206 
1207  } else {
1208  /* no more ID3 tags */
1209  break;
1210  }
1211  }
1212 
1213  /* re-fill buffer for the caller unless EOF */
1214  if (*len >= 0 && (fill_buf || *len == 0)) {
1215  bytes = read_from_url(pls, seg, buf + *len, buf_size - *len);
1216 
1217  /* ignore error if we already had some data */
1218  if (bytes >= 0)
1219  *len += bytes;
1220  else if (*len == 0)
1221  *len = bytes;
1222  }
1223 
1224  if (pls->id3_buf) {
1225  /* Now parse all the ID3 tags */
1226  AVIOContext id3ioctx;
1227  ffio_init_context(&id3ioctx, pls->id3_buf, id3_buf_pos, 0, NULL, NULL, NULL, NULL);
1228  handle_id3(&id3ioctx, pls);
1229  }
1230 
1231  if (pls->is_id3_timestamped == -1)
1233 }
1234 
1235 static int open_input(HLSContext *c, struct playlist *pls, struct segment *seg, AVIOContext **in)
1236 {
1237  AVDictionary *opts = NULL;
1238  int ret;
1239  int is_http = 0;
1240 
1241  if (c->http_persistent)
1242  av_dict_set(&opts, "multiple_requests", "1", 0);
1243 
1244  if (seg->size >= 0) {
1245  /* try to restrict the HTTP request to the part we want
1246  * (if this is in fact a HTTP request) */
1247  av_dict_set_int(&opts, "offset", seg->url_offset, 0);
1248  av_dict_set_int(&opts, "end_offset", seg->url_offset + seg->size, 0);
1249  }
1250 
1251  av_log(pls->parent, AV_LOG_VERBOSE, "HLS request for url '%s', offset %"PRId64", playlist %d\n",
1252  seg->url, seg->url_offset, pls->index);
1253 
1254  if (seg->key_type == KEY_NONE) {
1255  ret = open_url(pls->parent, in, seg->url, &c->avio_opts, opts, &is_http);
1256  } else if (seg->key_type == KEY_AES_128) {
1257  char iv[33], key[33], url[MAX_URL_SIZE];
1258  if (strcmp(seg->key, pls->key_url)) {
1259  AVIOContext *pb = NULL;
1260  if (open_url(pls->parent, &pb, seg->key, &c->avio_opts, opts, NULL) == 0) {
1261  ret = avio_read(pb, pls->key, sizeof(pls->key));
1262  if (ret != sizeof(pls->key)) {
1263  av_log(pls->parent, AV_LOG_ERROR, "Unable to read key file %s\n",
1264  seg->key);
1265  }
1266  ff_format_io_close(pls->parent, &pb);
1267  } else {
1268  av_log(pls->parent, AV_LOG_ERROR, "Unable to open key file %s\n",
1269  seg->key);
1270  }
1271  av_strlcpy(pls->key_url, seg->key, sizeof(pls->key_url));
1272  }
1273  ff_data_to_hex(iv, seg->iv, sizeof(seg->iv), 0);
1274  ff_data_to_hex(key, pls->key, sizeof(pls->key), 0);
1275  iv[32] = key[32] = '\0';
1276  if (strstr(seg->url, "://"))
1277  snprintf(url, sizeof(url), "crypto+%s", seg->url);
1278  else
1279  snprintf(url, sizeof(url), "crypto:%s", seg->url);
1280 
1281  av_dict_set(&opts, "key", key, 0);
1282  av_dict_set(&opts, "iv", iv, 0);
1283 
1284  ret = open_url(pls->parent, in, url, &c->avio_opts, opts, &is_http);
1285  if (ret < 0) {
1286  goto cleanup;
1287  }
1288  ret = 0;
1289  } else if (seg->key_type == KEY_SAMPLE_AES) {
1290  av_log(pls->parent, AV_LOG_ERROR,
1291  "SAMPLE-AES encryption is not supported yet\n");
1293  }
1294  else
1295  ret = AVERROR(ENOSYS);
1296 
1297  /* Seek to the requested position. If this was a HTTP request, the offset
1298  * should already be where want it to, but this allows e.g. local testing
1299  * without a HTTP server.
1300  *
1301  * This is not done for HTTP at all as avio_seek() does internal bookkeeping
1302  * of file offset which is out-of-sync with the actual offset when "offset"
1303  * AVOption is used with http protocol, causing the seek to not be a no-op
1304  * as would be expected. Wrong offset received from the server will not be
1305  * noticed without the call, though.
1306  */
1307  if (ret == 0 && !is_http && seg->url_offset) {
1308  int64_t seekret = avio_seek(*in, seg->url_offset, SEEK_SET);
1309  if (seekret < 0) {
1310  av_log(pls->parent, AV_LOG_ERROR, "Unable to seek to offset %"PRId64" of HLS segment '%s'\n", seg->url_offset, seg->url);
1311  ret = seekret;
1312  ff_format_io_close(pls->parent, in);
1313  }
1314  }
1315 
1316 cleanup:
1317  av_dict_free(&opts);
1318  pls->cur_seg_offset = 0;
1319  return ret;
1320 }
1321 
1322 static int update_init_section(struct playlist *pls, struct segment *seg)
1323 {
1324  static const int max_init_section_size = 1024*1024;
1325  HLSContext *c = pls->parent->priv_data;
1326  int64_t sec_size;
1327  int64_t urlsize;
1328  int ret;
1329 
1330  if (seg->init_section == pls->cur_init_section)
1331  return 0;
1332 
1333  pls->cur_init_section = NULL;
1334 
1335  if (!seg->init_section)
1336  return 0;
1337 
1338  ret = open_input(c, pls, seg->init_section, &pls->input);
1339  if (ret < 0) {
1341  "Failed to open an initialization section in playlist %d\n",
1342  pls->index);
1343  return ret;
1344  }
1345 
1346  if (seg->init_section->size >= 0)
1347  sec_size = seg->init_section->size;
1348  else if ((urlsize = avio_size(pls->input)) >= 0)
1349  sec_size = urlsize;
1350  else
1351  sec_size = max_init_section_size;
1352 
1353  av_log(pls->parent, AV_LOG_DEBUG,
1354  "Downloading an initialization section of size %"PRId64"\n",
1355  sec_size);
1356 
1357  sec_size = FFMIN(sec_size, max_init_section_size);
1358 
1359  av_fast_malloc(&pls->init_sec_buf, &pls->init_sec_buf_size, sec_size);
1360 
1361  ret = read_from_url(pls, seg->init_section, pls->init_sec_buf,
1362  pls->init_sec_buf_size);
1363  ff_format_io_close(pls->parent, &pls->input);
1364 
1365  if (ret < 0)
1366  return ret;
1367 
1368  pls->cur_init_section = seg->init_section;
1369  pls->init_sec_data_len = ret;
1370  pls->init_sec_buf_read_offset = 0;
1371 
1372  /* spec says audio elementary streams do not have media initialization
1373  * sections, so there should be no ID3 timestamps */
1374  pls->is_id3_timestamped = 0;
1375 
1376  return 0;
1377 }
1378 
1379 static int64_t default_reload_interval(struct playlist *pls)
1380 {
1381  return pls->n_segments > 0 ?
1382  pls->segments[pls->n_segments - 1]->duration :
1383  pls->target_duration;
1384 }
1385 
1386 static int playlist_needed(struct playlist *pls)
1387 {
1388  AVFormatContext *s = pls->parent;
1389  int i, j;
1390  int stream_needed = 0;
1391  int first_st;
1392 
1393  /* If there is no context or streams yet, the playlist is needed */
1394  if (!pls->ctx || !pls->n_main_streams)
1395  return 1;
1396 
1397  /* check if any of the streams in the playlist are needed */
1398  for (i = 0; i < pls->n_main_streams; i++) {
1399  if (pls->main_streams[i]->discard < AVDISCARD_ALL) {
1400  stream_needed = 1;
1401  break;
1402  }
1403  }
1404 
1405  /* If all streams in the playlist were discarded, the playlist is not
1406  * needed (regardless of whether whole programs are discarded or not). */
1407  if (!stream_needed)
1408  return 0;
1409 
1410  /* Otherwise, check if all the programs (variants) this playlist is in are
1411  * discarded. Since all streams in the playlist are part of the same programs
1412  * we can just check the programs of the first stream. */
1413 
1414  first_st = pls->main_streams[0]->index;
1415 
1416  for (i = 0; i < s->nb_programs; i++) {
1417  AVProgram *program = s->programs[i];
1418  if (program->discard < AVDISCARD_ALL) {
1419  for (j = 0; j < program->nb_stream_indexes; j++) {
1420  if (program->stream_index[j] == first_st) {
1421  /* playlist is in an undiscarded program */
1422  return 1;
1423  }
1424  }
1425  }
1426  }
1427 
1428  /* some streams were not discarded but all the programs were */
1429  return 0;
1430 }
1431 
1432 static int read_data(void *opaque, uint8_t *buf, int buf_size)
1433 {
1434  struct playlist *v = opaque;
1435  HLSContext *c = v->parent->priv_data;
1436  int ret;
1437  int just_opened = 0;
1438  int reload_count = 0;
1439  struct segment *seg;
1440 
1441 restart:
1442  if (!v->needed)
1443  return AVERROR_EOF;
1444 
1445  if (!v->input || (c->http_persistent && v->input_read_done)) {
1446  int64_t reload_interval;
1447 
1448  /* Check that the playlist is still needed before opening a new
1449  * segment. */
1450  v->needed = playlist_needed(v);
1451 
1452  if (!v->needed) {
1453  av_log(v->parent, AV_LOG_INFO, "No longer receiving playlist %d ('%s')\n",
1454  v->index, v->url);
1455  return AVERROR_EOF;
1456  }
1457 
1458  /* If this is a live stream and the reload interval has elapsed since
1459  * the last playlist reload, reload the playlists now. */
1460  reload_interval = default_reload_interval(v);
1461 
1462 reload:
1463  reload_count++;
1464  if (reload_count > c->max_reload)
1465  return AVERROR_EOF;
1466  if (!v->finished &&
1467  av_gettime_relative() - v->last_load_time >= reload_interval) {
1468  if ((ret = parse_playlist(c, v->url, v, NULL)) < 0) {
1469  if (ret != AVERROR_EXIT)
1470  av_log(v->parent, AV_LOG_WARNING, "Failed to reload playlist %d\n",
1471  v->index);
1472  return ret;
1473  }
1474  /* If we need to reload the playlist again below (if
1475  * there's still no more segments), switch to a reload
1476  * interval of half the target duration. */
1477  reload_interval = v->target_duration / 2;
1478  }
1479  if (v->cur_seq_no < v->start_seq_no) {
1481  "skipping %"PRId64" segments ahead, expired from playlists\n",
1482  v->start_seq_no - v->cur_seq_no);
1483  v->cur_seq_no = v->start_seq_no;
1484  }
1485  if (v->cur_seq_no > v->last_seq_no) {
1486  v->last_seq_no = v->cur_seq_no;
1487  v->m3u8_hold_counters = 0;
1488  } else if (v->last_seq_no == v->cur_seq_no) {
1489  v->m3u8_hold_counters++;
1490  if (v->m3u8_hold_counters >= c->m3u8_hold_counters) {
1491  return AVERROR_EOF;
1492  }
1493  } else {
1494  av_log(v->parent, AV_LOG_WARNING, "maybe the m3u8 list sequence have been wraped.\n");
1495  }
1496  if (v->cur_seq_no >= v->start_seq_no + v->n_segments) {
1497  if (v->finished)
1498  return AVERROR_EOF;
1499  while (av_gettime_relative() - v->last_load_time < reload_interval) {
1500  if (ff_check_interrupt(c->interrupt_callback))
1501  return AVERROR_EXIT;
1502  av_usleep(100*1000);
1503  }
1504  /* Enough time has elapsed since the last reload */
1505  goto reload;
1506  }
1507 
1508  v->input_read_done = 0;
1509  seg = current_segment(v);
1510 
1511  /* load/update Media Initialization Section, if any */
1512  ret = update_init_section(v, seg);
1513  if (ret)
1514  return ret;
1515 
1516  if (c->http_multiple == 1 && v->input_next_requested) {
1517  FFSWAP(AVIOContext *, v->input, v->input_next);
1518  v->cur_seg_offset = 0;
1519  v->input_next_requested = 0;
1520  ret = 0;
1521  } else {
1522  ret = open_input(c, v, seg, &v->input);
1523  }
1524  if (ret < 0) {
1525  if (ff_check_interrupt(c->interrupt_callback))
1526  return AVERROR_EXIT;
1527  av_log(v->parent, AV_LOG_WARNING, "Failed to open segment %"PRId64" of playlist %d\n",
1528  v->cur_seq_no,
1529  v->index);
1530  v->cur_seq_no += 1;
1531  goto reload;
1532  }
1533  just_opened = 1;
1534  }
1535 
1536  if (c->http_multiple == -1) {
1537  uint8_t *http_version_opt = NULL;
1538  int r = av_opt_get(v->input, "http_version", AV_OPT_SEARCH_CHILDREN, &http_version_opt);
1539  if (r >= 0) {
1540  c->http_multiple = (!strncmp((const char *)http_version_opt, "1.1", 3) || !strncmp((const char *)http_version_opt, "2.0", 3));
1541  av_freep(&http_version_opt);
1542  }
1543  }
1544 
1545  seg = next_segment(v);
1546  if (c->http_multiple == 1 && !v->input_next_requested &&
1547  seg && seg->key_type == KEY_NONE && av_strstart(seg->url, "http", NULL)) {
1548  ret = open_input(c, v, seg, &v->input_next);
1549  if (ret < 0) {
1550  if (ff_check_interrupt(c->interrupt_callback))
1551  return AVERROR_EXIT;
1552  av_log(v->parent, AV_LOG_WARNING, "Failed to open segment %"PRId64" of playlist %d\n",
1553  v->cur_seq_no + 1,
1554  v->index);
1555  } else {
1556  v->input_next_requested = 1;
1557  }
1558  }
1559 
1561  /* Push init section out first before first actual segment */
1562  int copy_size = FFMIN(v->init_sec_data_len - v->init_sec_buf_read_offset, buf_size);
1563  memcpy(buf, v->init_sec_buf, copy_size);
1564  v->init_sec_buf_read_offset += copy_size;
1565  return copy_size;
1566  }
1567 
1568  seg = current_segment(v);
1569  ret = read_from_url(v, seg, buf, buf_size);
1570  if (ret > 0) {
1571  if (just_opened && v->is_id3_timestamped != 0) {
1572  /* Intercept ID3 tags here, elementary audio streams are required
1573  * to convey timestamps using them in the beginning of each segment. */
1574  intercept_id3(v, buf, buf_size, &ret);
1575  }
1576 
1577  return ret;
1578  }
1579  if (c->http_persistent &&
1580  seg->key_type == KEY_NONE && av_strstart(seg->url, "http", NULL)) {
1581  v->input_read_done = 1;
1582  } else {
1583  ff_format_io_close(v->parent, &v->input);
1584  }
1585  v->cur_seq_no++;
1586 
1587  c->cur_seq_no = v->cur_seq_no;
1588 
1589  goto restart;
1590 }
1591 
1592 static void add_renditions_to_variant(HLSContext *c, struct variant *var,
1593  enum AVMediaType type, const char *group_id)
1594 {
1595  int i;
1596 
1597  for (i = 0; i < c->n_renditions; i++) {
1598  struct rendition *rend = c->renditions[i];
1599 
1600  if (rend->type == type && !strcmp(rend->group_id, group_id)) {
1601 
1602  if (rend->playlist)
1603  /* rendition is an external playlist
1604  * => add the playlist to the variant */
1605  dynarray_add(&var->playlists, &var->n_playlists, rend->playlist);
1606  else
1607  /* rendition is part of the variant main Media Playlist
1608  * => add the rendition to the main Media Playlist */
1609  dynarray_add(&var->playlists[0]->renditions,
1610  &var->playlists[0]->n_renditions,
1611  rend);
1612  }
1613  }
1614 }
1615 
1617  enum AVMediaType type)
1618 {
1619  int rend_idx = 0;
1620  int i;
1621 
1622  for (i = 0; i < pls->n_main_streams; i++) {
1623  AVStream *st = pls->main_streams[i];
1624 
1625  if (st->codecpar->codec_type != type)
1626  continue;
1627 
1628  for (; rend_idx < pls->n_renditions; rend_idx++) {
1629  struct rendition *rend = pls->renditions[rend_idx];
1630 
1631  if (rend->type != type)
1632  continue;
1633 
1634  if (rend->language[0])
1635  av_dict_set(&st->metadata, "language", rend->language, 0);
1636  if (rend->name[0])
1637  av_dict_set(&st->metadata, "comment", rend->name, 0);
1638 
1639  st->disposition |= rend->disposition;
1640  }
1641  if (rend_idx >=pls->n_renditions)
1642  break;
1643  }
1644 }
1645 
1646 /* if timestamp was in valid range: returns 1 and sets seq_no
1647  * if not: returns 0 and sets seq_no to closest segment */
1649  int64_t timestamp, int64_t *seq_no)
1650 {
1651  int i;
1652  int64_t pos = c->first_timestamp == AV_NOPTS_VALUE ?
1653  0 : c->first_timestamp;
1654 
1655  if (timestamp < pos) {
1656  *seq_no = pls->start_seq_no;
1657  return 0;
1658  }
1659 
1660  for (i = 0; i < pls->n_segments; i++) {
1661  int64_t diff = pos + pls->segments[i]->duration - timestamp;
1662  if (diff > 0) {
1663  *seq_no = pls->start_seq_no + i;
1664  return 1;
1665  }
1666  pos += pls->segments[i]->duration;
1667  }
1668 
1669  *seq_no = pls->start_seq_no + pls->n_segments - 1;
1670 
1671  return 0;
1672 }
1673 
1674 static int64_t select_cur_seq_no(HLSContext *c, struct playlist *pls)
1675 {
1676  int64_t seq_no;
1677 
1678  if (!pls->finished && !c->first_packet &&
1680  /* reload the playlist since it was suspended */
1681  parse_playlist(c, pls->url, pls, NULL);
1682 
1683  /* If playback is already in progress (we are just selecting a new
1684  * playlist) and this is a complete file, find the matching segment
1685  * by counting durations. */
1686  if (pls->finished && c->cur_timestamp != AV_NOPTS_VALUE) {
1687  find_timestamp_in_playlist(c, pls, c->cur_timestamp, &seq_no);
1688  return seq_no;
1689  }
1690 
1691  if (!pls->finished) {
1692  if (!c->first_packet && /* we are doing a segment selection during playback */
1693  c->cur_seq_no >= pls->start_seq_no &&
1694  c->cur_seq_no < pls->start_seq_no + pls->n_segments)
1695  /* While spec 3.4.3 says that we cannot assume anything about the
1696  * content at the same sequence number on different playlists,
1697  * in practice this seems to work and doing it otherwise would
1698  * require us to download a segment to inspect its timestamps. */
1699  return c->cur_seq_no;
1700 
1701  /* If this is a live stream, start live_start_index segments from the
1702  * start or end */
1703  if (c->live_start_index < 0)
1704  return pls->start_seq_no + FFMAX(pls->n_segments + c->live_start_index, 0);
1705  else
1706  return pls->start_seq_no + FFMIN(c->live_start_index, pls->n_segments - 1);
1707  }
1708 
1709  /* Otherwise just start on the first segment. */
1710  return pls->start_seq_no;
1711 }
1712 
1714 {
1715  HLSContext *c = s->priv_data;
1716  static const char * const opts[] = {
1717  "headers", "http_proxy", "user_agent", "cookies", "referer", "rw_timeout", "icy", NULL };
1718  const char * const * opt = opts;
1719  uint8_t *buf;
1720  int ret = 0;
1721 
1722  while (*opt) {
1723  if (av_opt_get(s->pb, *opt, AV_OPT_SEARCH_CHILDREN | AV_OPT_ALLOW_NULL, &buf) >= 0) {
1724  ret = av_dict_set(&c->avio_opts, *opt, buf,
1726  if (ret < 0)
1727  return ret;
1728  }
1729  opt++;
1730  }
1731 
1732  return ret;
1733 }
1734 
1735 static int nested_io_open(AVFormatContext *s, AVIOContext **pb, const char *url,
1736  int flags, AVDictionary **opts)
1737 {
1739  "A HLS playlist item '%s' referred to an external file '%s'. "
1740  "Opening this file was forbidden for security reasons\n",
1741  s->url, url);
1742  return AVERROR(EPERM);
1743 }
1744 
1745 static void add_stream_to_programs(AVFormatContext *s, struct playlist *pls, AVStream *stream)
1746 {
1747  HLSContext *c = s->priv_data;
1748  int i, j;
1749  int bandwidth = -1;
1750 
1751  for (i = 0; i < c->n_variants; i++) {
1752  struct variant *v = c->variants[i];
1753 
1754  for (j = 0; j < v->n_playlists; j++) {
1755  if (v->playlists[j] != pls)
1756  continue;
1757 
1758  av_program_add_stream_index(s, i, stream->index);
1759 
1760  if (bandwidth < 0)
1761  bandwidth = v->bandwidth;
1762  else if (bandwidth != v->bandwidth)
1763  bandwidth = -1; /* stream in multiple variants with different bandwidths */
1764  }
1765  }
1766 
1767  if (bandwidth >= 0)
1768  av_dict_set_int(&stream->metadata, "variant_bitrate", bandwidth, 0);
1769 }
1770 
1772 {
1773  int err;
1774 
1775  err = avcodec_parameters_copy(st->codecpar, ist->codecpar);
1776  if (err < 0)
1777  return err;
1778 
1779  if (pls->is_id3_timestamped) /* custom timestamps via id3 */
1780  avpriv_set_pts_info(st, 33, 1, MPEG_TIME_BASE);
1781  else
1783 
1784  // copy disposition
1785  st->disposition = ist->disposition;
1786 
1787  // copy side data
1788  for (int i = 0; i < ist->nb_side_data; i++) {
1789  const AVPacketSideData *sd_src = &ist->side_data[i];
1790  uint8_t *dst_data;
1791 
1792  dst_data = av_stream_new_side_data(st, sd_src->type, sd_src->size);
1793  if (!dst_data)
1794  return AVERROR(ENOMEM);
1795  memcpy(dst_data, sd_src->data, sd_src->size);
1796  }
1797 
1798  st->internal->need_context_update = 1;
1799 
1800  return 0;
1801 }
1802 
1803 /* add new subdemuxer streams to our context, if any */
1805 {
1806  int err;
1807 
1808  while (pls->n_main_streams < pls->ctx->nb_streams) {
1809  int ist_idx = pls->n_main_streams;
1811  AVStream *ist = pls->ctx->streams[ist_idx];
1812 
1813  if (!st)
1814  return AVERROR(ENOMEM);
1815 
1816  st->id = pls->index;
1817  dynarray_add(&pls->main_streams, &pls->n_main_streams, st);
1818 
1819  add_stream_to_programs(s, pls, st);
1820 
1821  err = set_stream_info_from_input_stream(st, pls, ist);
1822  if (err < 0)
1823  return err;
1824  }
1825 
1826  return 0;
1827 }
1828 
1830 {
1831  HLSContext *c = s->priv_data;
1832  int flag_needed = 0;
1833  int i;
1834 
1835  for (i = 0; i < c->n_playlists; i++) {
1836  struct playlist *pls = c->playlists[i];
1837 
1838  if (pls->has_noheader_flag) {
1839  flag_needed = 1;
1840  break;
1841  }
1842  }
1843 
1844  if (flag_needed)
1845  s->ctx_flags |= AVFMTCTX_NOHEADER;
1846  else
1847  s->ctx_flags &= ~AVFMTCTX_NOHEADER;
1848 }
1849 
1851 {
1852  HLSContext *c = s->priv_data;
1853 
1857 
1858  av_dict_free(&c->avio_opts);
1859  ff_format_io_close(c->ctx, &c->playlist_pb);
1860 
1861  return 0;
1862 }
1863 
1865 {
1866  HLSContext *c = s->priv_data;
1867  int ret = 0, i;
1868  int64_t highest_cur_seq_no = 0;
1869 
1870  c->ctx = s;
1871  c->interrupt_callback = &s->interrupt_callback;
1872 
1873  c->first_packet = 1;
1874  c->first_timestamp = AV_NOPTS_VALUE;
1875  c->cur_timestamp = AV_NOPTS_VALUE;
1876 
1877  if ((ret = save_avio_options(s)) < 0)
1878  goto fail;
1879 
1880  /* XXX: Some HLS servers don't like being sent the range header,
1881  in this case, need to setting http_seekable = 0 to disable
1882  the range header */
1883  av_dict_set_int(&c->avio_opts, "seekable", c->http_seekable, 0);
1884 
1885  if ((ret = parse_playlist(c, s->url, NULL, s->pb)) < 0)
1886  goto fail;
1887 
1888  if (c->n_variants == 0) {
1889  av_log(s, AV_LOG_WARNING, "Empty playlist\n");
1890  ret = AVERROR_EOF;
1891  goto fail;
1892  }
1893  /* If the playlist only contained playlists (Master Playlist),
1894  * parse each individual playlist. */
1895  if (c->n_playlists > 1 || c->playlists[0]->n_segments == 0) {
1896  for (i = 0; i < c->n_playlists; i++) {
1897  struct playlist *pls = c->playlists[i];
1898  pls->m3u8_hold_counters = 0;
1899  if ((ret = parse_playlist(c, pls->url, pls, NULL)) < 0) {
1900  av_log(s, AV_LOG_WARNING, "parse_playlist error %s [%s]\n", av_err2str(ret), pls->url);
1901  pls->broken = 1;
1902  if (c->n_playlists > 1)
1903  continue;
1904  goto fail;
1905  }
1906  }
1907  }
1908 
1909  for (i = 0; i < c->n_variants; i++) {
1910  if (c->variants[i]->playlists[0]->n_segments == 0) {
1911  av_log(s, AV_LOG_WARNING, "Empty segment [%s]\n", c->variants[i]->playlists[0]->url);
1912  c->variants[i]->playlists[0]->broken = 1;
1913  }
1914  }
1915 
1916  /* If this isn't a live stream, calculate the total duration of the
1917  * stream. */
1918  if (c->variants[0]->playlists[0]->finished) {
1919  int64_t duration = 0;
1920  for (i = 0; i < c->variants[0]->playlists[0]->n_segments; i++)
1921  duration += c->variants[0]->playlists[0]->segments[i]->duration;
1922  s->duration = duration;
1923  }
1924 
1925  /* Associate renditions with variants */
1926  for (i = 0; i < c->n_variants; i++) {
1927  struct variant *var = c->variants[i];
1928 
1929  if (var->audio_group[0])
1931  if (var->video_group[0])
1933  if (var->subtitles_group[0])
1935  }
1936 
1937  /* Create a program for each variant */
1938  for (i = 0; i < c->n_variants; i++) {
1939  struct variant *v = c->variants[i];
1940  AVProgram *program;
1941 
1942  program = av_new_program(s, i);
1943  if (!program)
1944  goto fail;
1945  av_dict_set_int(&program->metadata, "variant_bitrate", v->bandwidth, 0);
1946  }
1947 
1948  /* Select the starting segments */
1949  for (i = 0; i < c->n_playlists; i++) {
1950  struct playlist *pls = c->playlists[i];
1951 
1952  if (pls->n_segments == 0)
1953  continue;
1954 
1955  pls->cur_seq_no = select_cur_seq_no(c, pls);
1956  highest_cur_seq_no = FFMAX(highest_cur_seq_no, pls->cur_seq_no);
1957  }
1958 
1959  /* Open the demuxer for each playlist */
1960  for (i = 0; i < c->n_playlists; i++) {
1961  struct playlist *pls = c->playlists[i];
1962  char *url;
1963  ff_const59 AVInputFormat *in_fmt = NULL;
1964 
1965  if (!(pls->ctx = avformat_alloc_context())) {
1966  ret = AVERROR(ENOMEM);
1967  goto fail;
1968  }
1969 
1970  if (pls->n_segments == 0)
1971  continue;
1972 
1973  pls->index = i;
1974  pls->needed = 1;
1975  pls->parent = s;
1976 
1977  /*
1978  * If this is a live stream and this playlist looks like it is one segment
1979  * behind, try to sync it up so that every substream starts at the same
1980  * time position (so e.g. avformat_find_stream_info() will see packets from
1981  * all active streams within the first few seconds). This is not very generic,
1982  * though, as the sequence numbers are technically independent.
1983  */
1984  if (!pls->finished && pls->cur_seq_no == highest_cur_seq_no - 1 &&
1985  highest_cur_seq_no < pls->start_seq_no + pls->n_segments) {
1986  pls->cur_seq_no = highest_cur_seq_no;
1987  }
1988 
1990  if (!pls->read_buffer){
1991  ret = AVERROR(ENOMEM);
1992  avformat_free_context(pls->ctx);
1993  pls->ctx = NULL;
1994  goto fail;
1995  }
1996  ffio_init_context(&pls->pb, pls->read_buffer, INITIAL_BUFFER_SIZE, 0, pls,
1997  read_data, NULL, NULL);
1998  pls->ctx->probesize = s->probesize > 0 ? s->probesize : 1024 * 4;
1999  pls->ctx->max_analyze_duration = s->max_analyze_duration > 0 ? s->max_analyze_duration : 4 * AV_TIME_BASE;
2000  pls->ctx->interrupt_callback = s->interrupt_callback;
2001  url = av_strdup(pls->segments[0]->url);
2002  ret = av_probe_input_buffer(&pls->pb, &in_fmt, url, NULL, 0, 0);
2003  if (ret < 0) {
2004  /* Free the ctx - it isn't initialized properly at this point,
2005  * so avformat_close_input shouldn't be called. If
2006  * avformat_open_input fails below, it frees and zeros the
2007  * context, so it doesn't need any special treatment like this. */
2008  av_log(s, AV_LOG_ERROR, "Error when loading first segment '%s'\n", url);
2009  avformat_free_context(pls->ctx);
2010  pls->ctx = NULL;
2011  av_free(url);
2012  goto fail;
2013  }
2014  av_free(url);
2015  pls->ctx->pb = &pls->pb;
2016  pls->ctx->io_open = nested_io_open;
2017  pls->ctx->flags |= s->flags & ~AVFMT_FLAG_CUSTOM_IO;
2018 
2019  if ((ret = ff_copy_whiteblacklists(pls->ctx, s)) < 0)
2020  goto fail;
2021 
2022  ret = avformat_open_input(&pls->ctx, pls->segments[0]->url, in_fmt, NULL);
2023  if (ret < 0)
2024  goto fail;
2025 
2026  if (pls->id3_deferred_extra && pls->ctx->nb_streams == 1) {
2031  }
2032 
2033  if (pls->is_id3_timestamped == -1)
2034  av_log(s, AV_LOG_WARNING, "No expected HTTP requests have been made\n");
2035 
2036  /*
2037  * For ID3 timestamped raw audio streams we need to detect the packet
2038  * durations to calculate timestamps in fill_timing_for_id3_timestamped_stream(),
2039  * but for other streams we can rely on our user calling avformat_find_stream_info()
2040  * on us if they want to.
2041  */
2042  if (pls->is_id3_timestamped || (pls->n_renditions > 0 && pls->renditions[0]->type == AVMEDIA_TYPE_AUDIO)) {
2044  if (ret < 0)
2045  goto fail;
2046  }
2047 
2048  pls->has_noheader_flag = !!(pls->ctx->ctx_flags & AVFMTCTX_NOHEADER);
2049 
2050  /* Create new AVStreams for each stream in this playlist */
2052  if (ret < 0)
2053  goto fail;
2054 
2055  /*
2056  * Copy any metadata from playlist to main streams, but do not set
2057  * event flags.
2058  */
2059  if (pls->n_main_streams)
2060  av_dict_copy(&pls->main_streams[0]->metadata, pls->ctx->metadata, 0);
2061 
2065  }
2066 
2068 
2069  return 0;
2070 fail:
2071  hls_close(s);
2072  return ret;
2073 }
2074 
2076 {
2077  HLSContext *c = s->priv_data;
2078  int i, changed = 0;
2079  int cur_needed;
2080 
2081  /* Check if any new streams are needed */
2082  for (i = 0; i < c->n_playlists; i++) {
2083  struct playlist *pls = c->playlists[i];
2084 
2085  cur_needed = playlist_needed(c->playlists[i]);
2086 
2087  if (pls->broken) {
2088  continue;
2089  }
2090  if (cur_needed && !pls->needed) {
2091  pls->needed = 1;
2092  changed = 1;
2093  pls->cur_seq_no = select_cur_seq_no(c, pls);
2094  pls->pb.eof_reached = 0;
2095  if (c->cur_timestamp != AV_NOPTS_VALUE) {
2096  /* catch up */
2097  pls->seek_timestamp = c->cur_timestamp;
2098  pls->seek_flags = AVSEEK_FLAG_ANY;
2099  pls->seek_stream_index = -1;
2100  }
2101  av_log(s, AV_LOG_INFO, "Now receiving playlist %d, segment %"PRId64"\n", i, pls->cur_seq_no);
2102  } else if (first && !cur_needed && pls->needed) {
2103  ff_format_io_close(pls->parent, &pls->input);
2104  pls->input_read_done = 0;
2105  ff_format_io_close(pls->parent, &pls->input_next);
2106  pls->input_next_requested = 0;
2107  pls->needed = 0;
2108  changed = 1;
2109  av_log(s, AV_LOG_INFO, "No longer receiving playlist %d\n", i);
2110  }
2111  }
2112  return changed;
2113 }
2114 
2116 {
2117  if (pls->id3_offset >= 0) {
2118  pls->pkt->dts = pls->id3_mpegts_timestamp +
2119  av_rescale_q(pls->id3_offset,
2120  pls->ctx->streams[pls->pkt->stream_index]->time_base,
2122  if (pls->pkt->duration)
2123  pls->id3_offset += pls->pkt->duration;
2124  else
2125  pls->id3_offset = -1;
2126  } else {
2127  /* there have been packets with unknown duration
2128  * since the last id3 tag, should not normally happen */
2129  pls->pkt->dts = AV_NOPTS_VALUE;
2130  }
2131 
2132  if (pls->pkt->duration)
2133  pls->pkt->duration = av_rescale_q(pls->pkt->duration,
2134  pls->ctx->streams[pls->pkt->stream_index]->time_base,
2136 
2137  pls->pkt->pts = AV_NOPTS_VALUE;
2138 }
2139 
2140 static AVRational get_timebase(struct playlist *pls)
2141 {
2142  if (pls->is_id3_timestamped)
2143  return MPEG_TIME_BASE_Q;
2144 
2145  return pls->ctx->streams[pls->pkt->stream_index]->time_base;
2146 }
2147 
2148 static int compare_ts_with_wrapdetect(int64_t ts_a, struct playlist *pls_a,
2149  int64_t ts_b, struct playlist *pls_b)
2150 {
2151  int64_t scaled_ts_a = av_rescale_q(ts_a, get_timebase(pls_a), MPEG_TIME_BASE_Q);
2152  int64_t scaled_ts_b = av_rescale_q(ts_b, get_timebase(pls_b), MPEG_TIME_BASE_Q);
2153 
2154  return av_compare_mod(scaled_ts_a, scaled_ts_b, 1LL << 33);
2155 }
2156 
2158 {
2159  HLSContext *c = s->priv_data;
2160  int ret, i, minplaylist = -1;
2161 
2162  recheck_discard_flags(s, c->first_packet);
2163  c->first_packet = 0;
2164 
2165  for (i = 0; i < c->n_playlists; i++) {
2166  struct playlist *pls = c->playlists[i];
2167  /* Make sure we've got one buffered packet from each open playlist
2168  * stream */
2169  if (pls->needed && !pls->pkt->data) {
2170  while (1) {
2171  int64_t ts_diff;
2172  AVRational tb;
2173  ret = av_read_frame(pls->ctx, pls->pkt);
2174  if (ret < 0) {
2175  if (!avio_feof(&pls->pb) && ret != AVERROR_EOF)
2176  return ret;
2177  break;
2178  } else {
2179  /* stream_index check prevents matching picture attachments etc. */
2180  if (pls->is_id3_timestamped && pls->pkt->stream_index == 0) {
2181  /* audio elementary streams are id3 timestamped */
2183  }
2184 
2185  if (c->first_timestamp == AV_NOPTS_VALUE &&
2186  pls->pkt->dts != AV_NOPTS_VALUE)
2187  c->first_timestamp = av_rescale_q(pls->pkt->dts,
2189  }
2190 
2191  if (pls->seek_timestamp == AV_NOPTS_VALUE)
2192  break;
2193 
2194  if (pls->seek_stream_index < 0 ||
2195  pls->seek_stream_index == pls->pkt->stream_index) {
2196 
2197  if (pls->pkt->dts == AV_NOPTS_VALUE) {
2199  break;
2200  }
2201 
2202  tb = get_timebase(pls);
2203  ts_diff = av_rescale_rnd(pls->pkt->dts, AV_TIME_BASE,
2204  tb.den, AV_ROUND_DOWN) -
2205  pls->seek_timestamp;
2206  if (ts_diff >= 0 && (pls->seek_flags & AVSEEK_FLAG_ANY ||
2207  pls->pkt->flags & AV_PKT_FLAG_KEY)) {
2209  break;
2210  }
2211  }
2212  av_packet_unref(pls->pkt);
2213  }
2214  }
2215  /* Check if this stream has the packet with the lowest dts */
2216  if (pls->pkt->data) {
2217  struct playlist *minpls = minplaylist < 0 ?
2218  NULL : c->playlists[minplaylist];
2219  if (minplaylist < 0) {
2220  minplaylist = i;
2221  } else {
2222  int64_t dts = pls->pkt->dts;
2223  int64_t mindts = minpls->pkt->dts;
2224 
2225  if (dts == AV_NOPTS_VALUE ||
2226  (mindts != AV_NOPTS_VALUE && compare_ts_with_wrapdetect(dts, pls, mindts, minpls) < 0))
2227  minplaylist = i;
2228  }
2229  }
2230  }
2231 
2232  /* If we got a packet, return it */
2233  if (minplaylist >= 0) {
2234  struct playlist *pls = c->playlists[minplaylist];
2235  AVStream *ist;
2236  AVStream *st;
2237 
2239  if (ret < 0) {
2240  av_packet_unref(pls->pkt);
2241  return ret;
2242  }
2243 
2244  // If sub-demuxer reports updated metadata, copy it to the first stream
2245  // and set its AVSTREAM_EVENT_FLAG_METADATA_UPDATED flag.
2247  if (pls->n_main_streams) {
2248  st = pls->main_streams[0];
2249  av_dict_copy(&st->metadata, pls->ctx->metadata, 0);
2251  }
2253  }
2254 
2255  /* check if noheader flag has been cleared by the subdemuxer */
2256  if (pls->has_noheader_flag && !(pls->ctx->ctx_flags & AVFMTCTX_NOHEADER)) {
2257  pls->has_noheader_flag = 0;
2259  }
2260 
2261  if (pls->pkt->stream_index >= pls->n_main_streams) {
2262  av_log(s, AV_LOG_ERROR, "stream index inconsistency: index %d, %d main streams, %d subdemuxer streams\n",
2263  pls->pkt->stream_index, pls->n_main_streams, pls->ctx->nb_streams);
2264  av_packet_unref(pls->pkt);
2265  return AVERROR_BUG;
2266  }
2267 
2268  ist = pls->ctx->streams[pls->pkt->stream_index];
2269  st = pls->main_streams[pls->pkt->stream_index];
2270 
2271  av_packet_move_ref(pkt, pls->pkt);
2272  pkt->stream_index = st->index;
2273 
2274  if (pkt->dts != AV_NOPTS_VALUE)
2275  c->cur_timestamp = av_rescale_q(pkt->dts,
2276  ist->time_base,
2277  AV_TIME_BASE_Q);
2278 
2279  /* There may be more situations where this would be useful, but this at least
2280  * handles newly probed codecs properly (i.e. request_probe by mpegts). */
2281  if (ist->codecpar->codec_id != st->codecpar->codec_id) {
2282  ret = set_stream_info_from_input_stream(st, pls, ist);
2283  if (ret < 0) {
2284  return ret;
2285  }
2286  }
2287 
2288  return 0;
2289  }
2290  return AVERROR_EOF;
2291 }
2292 
2293 static int hls_read_seek(AVFormatContext *s, int stream_index,
2294  int64_t timestamp, int flags)
2295 {
2296  HLSContext *c = s->priv_data;
2297  struct playlist *seek_pls = NULL;
2298  int i, j;
2299  int stream_subdemuxer_index;
2300  int64_t first_timestamp, seek_timestamp, duration;
2301  int64_t seq_no;
2302 
2303  if ((flags & AVSEEK_FLAG_BYTE) || (c->ctx->ctx_flags & AVFMTCTX_UNSEEKABLE))
2304  return AVERROR(ENOSYS);
2305 
2306  first_timestamp = c->first_timestamp == AV_NOPTS_VALUE ?
2307  0 : c->first_timestamp;
2308 
2310  s->streams[stream_index]->time_base.den,
2313 
2314  duration = s->duration == AV_NOPTS_VALUE ?
2315  0 : s->duration;
2316 
2317  if (0 < duration && duration < seek_timestamp - first_timestamp)
2318  return AVERROR(EIO);
2319 
2320  /* find the playlist with the specified stream */
2321  for (i = 0; i < c->n_playlists; i++) {
2322  struct playlist *pls = c->playlists[i];
2323  for (j = 0; j < pls->n_main_streams; j++) {
2324  if (pls->main_streams[j] == s->streams[stream_index]) {
2325  seek_pls = pls;
2326  stream_subdemuxer_index = j;
2327  break;
2328  }
2329  }
2330  }
2331  /* check if the timestamp is valid for the playlist with the
2332  * specified stream index */
2333  if (!seek_pls || !find_timestamp_in_playlist(c, seek_pls, seek_timestamp, &seq_no))
2334  return AVERROR(EIO);
2335 
2336  /* set segment now so we do not need to search again below */
2337  seek_pls->cur_seq_no = seq_no;
2338  seek_pls->seek_stream_index = stream_subdemuxer_index;
2339 
2340  for (i = 0; i < c->n_playlists; i++) {
2341  /* Reset reading */
2342  struct playlist *pls = c->playlists[i];
2343  ff_format_io_close(pls->parent, &pls->input);
2344  pls->input_read_done = 0;
2345  ff_format_io_close(pls->parent, &pls->input_next);
2346  pls->input_next_requested = 0;
2347  av_packet_unref(pls->pkt);
2348  pls->pb.eof_reached = 0;
2349  /* Clear any buffered data */
2350  pls->pb.buf_end = pls->pb.buf_ptr = pls->pb.buffer;
2351  /* Reset the pos, to let the mpegts demuxer know we've seeked. */
2352  pls->pb.pos = 0;
2353  /* Flush the packet queue of the subdemuxer. */
2354  ff_read_frame_flush(pls->ctx);
2355 
2357  pls->seek_flags = flags;
2358 
2359  if (pls != seek_pls) {
2360  /* set closest segment seq_no for playlists not handled above */
2362  /* seek the playlist to the given position without taking
2363  * keyframes into account since this playlist does not have the
2364  * specified stream where we should look for the keyframes */
2365  pls->seek_stream_index = -1;
2366  pls->seek_flags |= AVSEEK_FLAG_ANY;
2367  }
2368  }
2369 
2370  c->cur_timestamp = seek_timestamp;
2371 
2372  return 0;
2373 }
2374 
2375 static int hls_probe(const AVProbeData *p)
2376 {
2377  /* Require #EXTM3U at the start, and either one of the ones below
2378  * somewhere for a proper match. */
2379  if (strncmp(p->buf, "#EXTM3U", 7))
2380  return 0;
2381 
2382  if (strstr(p->buf, "#EXT-X-STREAM-INF:") ||
2383  strstr(p->buf, "#EXT-X-TARGETDURATION:") ||
2384  strstr(p->buf, "#EXT-X-MEDIA-SEQUENCE:"))
2385  return AVPROBE_SCORE_MAX;
2386  return 0;
2387 }
2388 
2389 #define OFFSET(x) offsetof(HLSContext, x)
2390 #define FLAGS AV_OPT_FLAG_DECODING_PARAM
2391 static const AVOption hls_options[] = {
2392  {"live_start_index", "segment index to start live streams at (negative values are from the end)",
2393  OFFSET(live_start_index), AV_OPT_TYPE_INT, {.i64 = -3}, INT_MIN, INT_MAX, FLAGS},
2394  {"allowed_extensions", "List of file extensions that hls is allowed to access",
2395  OFFSET(allowed_extensions), AV_OPT_TYPE_STRING,
2396  {.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"},
2397  INT_MIN, INT_MAX, FLAGS},
2398  {"max_reload", "Maximum number of times a insufficient list is attempted to be reloaded",
2399  OFFSET(max_reload), AV_OPT_TYPE_INT, {.i64 = 1000}, 0, INT_MAX, FLAGS},
2400  {"m3u8_hold_counters", "The maximum number of times to load m3u8 when it refreshes without new segments",
2401  OFFSET(m3u8_hold_counters), AV_OPT_TYPE_INT, {.i64 = 1000}, 0, INT_MAX, FLAGS},
2402  {"http_persistent", "Use persistent HTTP connections",
2403  OFFSET(http_persistent), AV_OPT_TYPE_BOOL, {.i64 = 1}, 0, 1, FLAGS },
2404  {"http_multiple", "Use multiple HTTP connections for fetching segments",
2405  OFFSET(http_multiple), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, FLAGS},
2406  {"http_seekable", "Use HTTP partial requests, 0 = disable, 1 = enable, -1 = auto",
2407  OFFSET(http_seekable), AV_OPT_TYPE_BOOL, { .i64 = -1}, -1, 1, FLAGS},
2408  {NULL}
2409 };
2410 
2411 static const AVClass hls_class = {
2412  .class_name = "hls demuxer",
2413  .item_name = av_default_item_name,
2414  .option = hls_options,
2415  .version = LIBAVUTIL_VERSION_INT,
2416 };
2417 
2419  .name = "hls",
2420  .long_name = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming"),
2421  .priv_class = &hls_class,
2422  .priv_data_size = sizeof(HLSContext),
2424  .read_probe = hls_probe,
2427  .read_close = hls_close,
2429 };
MPEG_TIME_BASE_Q
#define MPEG_TIME_BASE_Q
Definition: hls.c:48
ff_get_chomp_line
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.
Definition: aviobuf.c:806
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: avpacket.c:634
playlist::start_seq_no
int64_t start_seq_no
Definition: hls.c:115
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:204
av_gettime_relative
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
Definition: time.c:56
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:200
MAX_CHARACTERISTICS_LEN
#define MAX_CHARACTERISTICS_LEN
Definition: hls.c:45
program
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
Definition: undefined.txt:6
playlist::input
AVIOContext * input
Definition: hls.c:97
playlist::seek_stream_index
int seek_stream_index
Definition: hls.c:150
free_segment_dynarray
static void free_segment_dynarray(struct segment **segments, int n_segments)
Definition: hls.c:218
r
const char * r
Definition: vf_curves.c:116
AVERROR
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
opt.h
avformat_new_stream
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
Definition: utils.c:4509
playlist::target_duration
int64_t target_duration
Definition: hls.c:114
AVCodecParameters::codec_type
enum AVMediaType codec_type
General type of the encoded data.
Definition: codec_par.h:56
playlist::n_renditions
int n_renditions
Definition: hls.c:156
HLSContext::avio_opts
AVDictionary * avio_opts
Definition: hls.c:209
HLSContext::n_variants
int n_variants
Definition: hls.c:195
ID3v2ExtraMeta::next
struct ID3v2ExtraMeta * next
Definition: id3v2.h:86
FF_COMPLIANCE_EXPERIMENTAL
#define FF_COMPLIANCE_EXPERIMENTAL
Allow nonstandardized experimental things.
Definition: avcodec.h:1606
FFSWAP
#define FFSWAP(type, a, b)
Definition: common.h:108
HLSContext::http_seekable
int http_seekable
Definition: hls.c:214
playlist
Definition: hls.c:93
KEY_AES_128
@ KEY_AES_128
Definition: hls.c:64
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:55
AVBufferRef::data
uint8_t * data
The data buffer.
Definition: buffer.h:92
playlist::input_next_requested
int input_next_requested
Definition: hls.c:100
AVStream::discard
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
Definition: avformat.h:928
segment::url_offset
int64_t url_offset
Definition: hls.c:70
variant_info::subtitles
char subtitles[MAX_FIELD_LEN]
Definition: hls.c:327
playlist::id3_mpegts_timestamp
int64_t id3_mpegts_timestamp
Definition: hls.c:139
new_init_section
static struct segment * new_init_section(struct playlist *pls, struct init_section_info *info, const char *url_base)
Definition: hls.c:400
AV_TIME_BASE_Q
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition: avutil.h:260
PLS_TYPE_VOD
@ PLS_TYPE_VOD
Definition: hls.c:85
playlist::input_next
AVIOContext * input_next
Definition: hls.c:99
playlist::id3_offset
int64_t id3_offset
Definition: hls.c:140
AV_DISPOSITION_DEFAULT
#define AV_DISPOSITION_DEFAULT
Definition: avformat.h:818
id3v2.h
playlist::seek_timestamp
int64_t seek_timestamp
Definition: hls.c:148
tmp
static uint8_t tmp[11]
Definition: aes_ctr.c:27
rendition_info::assoc_language
char assoc_language[MAX_FIELD_LEN]
Definition: hls.c:461
cleanup
static av_cold void cleanup(FlashSV2Context *s)
Definition: flashsv2enc.c:127
AVFormatContext::streams
AVStream ** streams
A list of all streams in the file.
Definition: avformat.h:1300
AVPacketSideData
Definition: packet.h:306
parse_id3
static void parse_id3(AVFormatContext *s, AVIOContext *pb, AVDictionary **metadata, int64_t *dts, ID3v2ExtraMetaAPIC **apic, ID3v2ExtraMeta **extra_meta)
Definition: hls.c:1038
AVPacket::data
uint8_t * data
Definition: packet.h:369
AVStream::internal
AVStreamInternal * internal
An opaque field for libavformat internal usage.
Definition: avformat.h:1113
segment::size
int64_t size
Definition: hls.c:71
variant::subtitles_group
char subtitles_group[MAX_FIELD_LEN]
Definition: hls.c:189
AVOption
AVOption.
Definition: opt.h:248
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)
Definition: hls.c:2148
AVFMT_FLAG_CUSTOM_IO
#define AVFMT_FLAG_CUSTOM_IO
The caller has supplied a custom AVIOContext, don't avio_close() it.
Definition: avformat.h:1371
playlist::finished
int finished
Definition: hls.c:112
AVSEEK_FLAG_BYTE
#define AVSEEK_FLAG_BYTE
seeking based on position in bytes
Definition: avformat.h:2416
AV_DICT_IGNORE_SUFFIX
#define AV_DICT_IGNORE_SUFFIX
Return first entry in a dictionary whose first part corresponds to the search key,...
Definition: dict.h:70
playlist::segments
struct segment ** segments
Definition: hls.c:117
rendition_info::type
char type[16]
Definition: hls.c:457
nested_io_open
static int nested_io_open(AVFormatContext *s, AVIOContext **pb, const char *url, int flags, AVDictionary **opts)
Definition: hls.c:1735
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:210
base
uint8_t base
Definition: vp3data.h:141
AVPacket::duration
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
Definition: packet.h:387
mathematics.h
AVDictionary
Definition: dict.c:30
segment::key
char * key
Definition: hls.c:73
AVFormatContext::probesize
int64_t probesize
Maximum size of the data read from input for determining the input container format.
Definition: avformat.h:1400
av_read_frame
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Return the next frame of a stream.
Definition: utils.c:1741
rendition::type
enum AVMediaType type
Definition: hls.c:172
rendition_info::uri
char uri[MAX_URL_SIZE]
Definition: hls.c:458
OFFSET
#define OFFSET(x)
Definition: hls.c:2389
avio_size
int64_t avio_size(AVIOContext *s)
Get the filesize.
Definition: aviobuf.c:342
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: packet.h:410
playlist::key_url
char key_url[MAX_URL_SIZE]
Definition: hls.c:133
av_packet_free
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition: avpacket.c:75
AV_WB64
#define AV_WB64(p, v)
Definition: intreadwrite.h:433
HLSContext::first_packet
int first_packet
Definition: hls.c:205
av_malloc
#define av_malloc(s)
Definition: tableprint_vlc.h:31
AVIOInterruptCB
Callback for checking whether to abort blocking functions.
Definition: avio.h:58
ff_const59
#define ff_const59
The ff_const59 define is not part of the public API and will be removed without further warning.
Definition: avformat.h:535
avformat_queue_attached_pictures
int avformat_queue_attached_pictures(AVFormatContext *s)
Definition: utils.c:454
AVBufferRef::size
int size
Size of data in bytes.
Definition: buffer.h:97
hls_close
static int hls_close(AVFormatContext *s)
Definition: hls.c:1850
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:453
avformat_close_input
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
Definition: utils.c:4481
AVPacketSideData::size
size_t size
Definition: packet.h:311
AVFormatContext::interrupt_callback
AVIOInterruptCB interrupt_callback
Custom interrupt callbacks for the I/O layer.
Definition: avformat.h:1512
HLSContext::http_multiple
int http_multiple
Definition: hls.c:213
key_info::iv
char iv[35]
Definition: hls.c:377
variant::audio_group
char audio_group[MAX_FIELD_LEN]
Definition: hls.c:187
recheck_discard_flags
static int recheck_discard_flags(AVFormatContext *s, int first)
Definition: hls.c:2075
hls_class
static const AVClass hls_class
Definition: hls.c:2411
segment::duration
int64_t duration
Definition: hls.c:69
fail
#define fail()
Definition: checkasm.h:133
AVSEEK_FLAG_ANY
#define AVSEEK_FLAG_ANY
seek to any frame, even non-keyframes
Definition: avformat.h:2417
new_variant
static struct variant * new_variant(HLSContext *c, struct variant_info *info, const char *url, const char *base)
Definition: hls.c:330
read_seek
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
Definition: libcdio.c:153
playlist::input_read_done
int input_read_done
Definition: hls.c:98
HLSContext::n_renditions
int n_renditions
Definition: hls.c:199
read_close
static av_cold int read_close(AVFormatContext *ctx)
Definition: libcdio.c:145
AVIOContext::pos
int64_t pos
position in the file of the current buffer
Definition: avio.h:238
variant
Definition: hls.c:180
AV_DISPOSITION_FORCED
#define AV_DISPOSITION_FORCED
Track should be used during playback by default.
Definition: avformat.h:830
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
dynarray_add
#define dynarray_add(tab, nb_ptr, elem)
Definition: internal.h:355
AV_ROUND_UP
@ AV_ROUND_UP
Round toward +infinity.
Definition: mathematics.h:83
av_new_program
AVProgram * av_new_program(AVFormatContext *s, int id)
Definition: utils.c:4607
ff_check_interrupt
int ff_check_interrupt(AVIOInterruptCB *cb)
Check if the user has requested to interrupt a blocking function associated with cb.
Definition: avio.c:661
ID3v2ExtraMeta::apic
ID3v2ExtraMetaAPIC apic
Definition: id3v2.h:88
ff_data_to_hex
char * ff_data_to_hex(char *buf, const uint8_t *src, int size, int lowercase)
Definition: utils.c:4896
AVRational::num
int num
Numerator.
Definition: rational.h:59
handle_rendition_args
static void handle_rendition_args(struct rendition_info *info, const char *key, int key_len, char **dest, int *dest_len)
Definition: hls.c:552
AVFormatContext::event_flags
int event_flags
Flags indicating events happening on the file, a combination of AVFMT_EVENT_FLAG_*.
Definition: avformat.h:1555
AVStream::attached_pic
AVPacket attached_pic
For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet will contain the attached pictu...
Definition: avformat.h:955
playlist::cur_seq_no
int64_t cur_seq_no
Definition: hls.c:120
AV_DICT_DONT_STRDUP_VAL
#define AV_DICT_DONT_STRDUP_VAL
Take ownership of a value that's been allocated with av_malloc() or another memory allocation functio...
Definition: dict.h:74
playlist::type
enum PlaylistType type
Definition: hls.c:113
open_url
static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url, AVDictionary **opts, AVDictionary *opts2, int *is_http_out)
Definition: hls.c:624
first
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But first
Definition: rate_distortion.txt:12
avassert.h
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:194
playlist::n_init_sections
int n_init_sections
Definition: hls.c:161
AVFormatContext::metadata
AVDictionary * metadata
Metadata that applies to the whole file.
Definition: avformat.h:1474
AVInputFormat
Definition: avformat.h:640
MPEG_TIME_BASE
#define MPEG_TIME_BASE
Definition: hls.c:47
ID3v2ExtraMeta
Definition: id3v2.h:84
AVFormatContext::ctx_flags
int ctx_flags
Flags signalling stream properties.
Definition: avformat.h:1281
duration
int64_t duration
Definition: movenc.c:64
free_rendition_list
static void free_rendition_list(HLSContext *c)
Definition: hls.c:287
hls_options
static const AVOption hls_options[]
Definition: hls.c:2391
av_dict_get
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
Definition: dict.c:40
variant_info
Definition: hls.c:322
fill_timing_for_id3_timestamped_stream
static void fill_timing_for_id3_timestamped_stream(struct playlist *pls)
Definition: hls.c:2115
av_fast_realloc
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.
Definition: mem.c:478
playlist_needed
static int playlist_needed(struct playlist *pls)
Definition: hls.c:1386
intreadwrite.h
key_info::uri
char uri[MAX_URL_SIZE]
Definition: hls.c:375
s
#define s(width, name)
Definition: cbs_vp9.c:257
segment::key_type
enum KeyType key_type
Definition: hls.c:74
KEY_SAMPLE_AES
@ KEY_SAMPLE_AES
Definition: hls.c:65
playlist::n_main_streams
int n_main_streams
Definition: hls.c:110
AVFormatContext::flags
int flags
Flags modifying the (de)muxer behaviour.
Definition: avformat.h:1363
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:645
AVProbeData::buf
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:443
AVDictionaryEntry::key
char * key
Definition: dict.h:82
playlist::init_sec_buf_read_offset
unsigned int init_sec_buf_read_offset
Definition: hls.c:131
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:202
HLSContext::cur_timestamp
int64_t cur_timestamp
Definition: hls.c:207
info
MIPS optimizations info
Definition: mips.txt:2
variant_info::video
char video[MAX_FIELD_LEN]
Definition: hls.c:326
av_strtok
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().
Definition: avstring.c:186
av_match_ext
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.
Definition: format.c:38
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:215
AVPacketSideData::data
uint8_t * data
Definition: packet.h:307
KEY_NONE
@ KEY_NONE
Definition: hls.c:63
HLSContext::n_playlists
int n_playlists
Definition: hls.c:197
variant_info::audio
char audio[MAX_FIELD_LEN]
Definition: hls.c:325
av_rescale_q
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
Definition: mathematics.c:142
playlist::init_sections
struct segment ** init_sections
Definition: hls.c:162
ID3v2ExtraMetaAPIC::buf
AVBufferRef * buf
Definition: id3v2.h:66
playlist::init_sec_buf
uint8_t * init_sec_buf
Definition: hls.c:128
add_renditions_to_variant
static void add_renditions_to_variant(HLSContext *c, struct variant *var, enum AVMediaType type, const char *group_id)
Definition: hls.c:1592
HLSContext::allowed_extensions
char * allowed_extensions
Definition: hls.c:210
playlist::id3_buf
uint8_t * id3_buf
Definition: hls.c:141
FLAGS
#define FLAGS
Definition: hls.c:2390
playlist::read_buffer
uint8_t * read_buffer
Definition: hls.c:96
key
const char * key
Definition: hwcontext_opencl.c:168
av_usleep
int av_usleep(unsigned usec)
Sleep for a period of time.
Definition: time.c:84
playlist::id3_buf_size
unsigned int id3_buf_size
Definition: hls.c:142
hls_read_header
static int hls_read_header(AVFormatContext *s)
Definition: hls.c:1864
init_section_info
Definition: hls.c:395
ff_hex_to_data
int ff_hex_to_data(uint8_t *data, const char *p)
Parse a string of hexadecimal strings.
Definition: utils.c:4917
AVFormatContext::max_analyze_duration
int64_t max_analyze_duration
Maximum duration (in AV_TIME_BASE units) of the data read from input in avformat_find_stream_info().
Definition: avformat.h:1408
handle_id3
static void handle_id3(AVIOContext *pb, struct playlist *pls)
Definition: hls.c:1093
free_variant_list
static void free_variant_list(HLSContext *c)
Definition: hls.c:275
ID3v2ExtraMeta::tag
const char * tag
Definition: id3v2.h:85
rendition::group_id
char group_id[MAX_FIELD_LEN]
Definition: hls.c:174
AVDISCARD_ALL
@ AVDISCARD_ALL
discard all
Definition: avcodec.h:236
AVFormatContext
Format I/O context.
Definition: avformat.h:1232
internal.h
HLSContext::interrupt_callback
AVIOInterruptCB * interrupt_callback
Definition: hls.c:208
opts
AVDictionary * opts
Definition: movenc.c:50
AVStream::codecpar
AVCodecParameters * codecpar
Codec parameters associated with this stream.
Definition: avformat.h:1038
variant::url
char url[MAX_URL_SIZE]
Definition: hlsproto.c:55
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVSEEK_FLAG_BACKWARD
#define AVSEEK_FLAG_BACKWARD
Definition: avformat.h:2415
read_header
static int read_header(FFV1Context *f)
Definition: ffv1dec.c:527
current_segment
static struct segment * current_segment(struct playlist *pls)
Definition: hls.c:1008
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:67
variant::n_playlists
int n_playlists
Definition: hls.c:184
AVStream::time_base
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
Definition: avformat.h:902
NULL
#define NULL
Definition: coverity.c:32
variant::playlists
struct playlist ** playlists
Definition: hls.c:185
ensure_playlist
static int ensure_playlist(HLSContext *c, struct playlist **pls, const char *url)
Definition: hls.c:596
AVERROR_PATCHWELCOME
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
read_probe
static int read_probe(const AVProbeData *pd)
Definition: jvdec.c:55
AVFMTCTX_NOHEADER
#define AVFMTCTX_NOHEADER
signal that no header is present (streams are added dynamically)
Definition: avformat.h:1177
ID3v2ExtraMetaPRIV::data
uint8_t * data
Definition: id3v2.h:74
fill_buf
static void fill_buf(uint8_t *data, int w, int h, int linesize, uint8_t v)
Definition: vf_fieldmatch.c:186
playlist::renditions
struct rendition ** renditions
Definition: hls.c:157
HLSContext::playlist_pb
AVIOContext * playlist_pb
Definition: hls.c:215
AVRational
Rational number (pair of numerator and denominator).
Definition: rational.h:58
AVFMTCTX_UNSEEKABLE
#define AVFMTCTX_UNSEEKABLE
signal that the stream is definitely not seekable, and attempts to call the seek function will fail.
Definition: avformat.h:1179
AVPacketSideData::type
enum AVPacketSideDataType type
Definition: packet.h:313
free_init_section_list
static void free_init_section_list(struct playlist *pls)
Definition: hls.c:235
HLSContext::variants
struct variant ** variants
Definition: hls.c:196
update_streams_from_subdemuxer
static int update_streams_from_subdemuxer(AVFormatContext *s, struct playlist *pls)
Definition: hls.c:1804
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:235
ff_id3v2_parse_apic
int ff_id3v2_parse_apic(AVFormatContext *s, ID3v2ExtraMeta *extra_meta)
Create a stream for each APIC (attached picture) extracted from the ID3v2 header.
Definition: id3v2.c:1142
HLSContext::max_reload
int max_reload
Definition: hls.c:211
AVFormatContext::pb
AVIOContext * pb
I/O context.
Definition: avformat.h:1274
ff_http_do_new_request2
int ff_http_do_new_request2(URLContext *h, const char *uri, AVDictionary **opts)
Send a new HTTP request, reusing the old connection.
Definition: http.c:396
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:441
AVStream::metadata
AVDictionary * metadata
Definition: avformat.h:937
rendition_info::defaultr
char defaultr[4]
Definition: hls.c:463
HLSContext::cur_seq_no
int64_t cur_seq_no
Definition: hls.c:202
playlist::broken
int broken
Definition: hls.c:119
time.h
KeyType
KeyType
Definition: hls.c:62
playlist::id3_deferred_extra
ID3v2ExtraMeta * id3_deferred_extra
Definition: hls.c:146
HLSContext::playlists
struct playlist ** playlists
Definition: hls.c:198
playlist::n_segments
int n_segments
Definition: hls.c:116
av_packet_move_ref
void av_packet_move_ref(AVPacket *dst, AVPacket *src)
Move every field in src to dst and reset src.
Definition: avpacket.c:690
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)
Definition: hls.c:444
MAX_FIELD_LEN
#define MAX_FIELD_LEN
Definition: hls.c:44
INITIAL_BUFFER_SIZE
#define INITIAL_BUFFER_SIZE
Definition: hls.c:42
ID3v2_HEADER_SIZE
#define ID3v2_HEADER_SIZE
Definition: id3v2.h:30
AVSTREAM_EVENT_FLAG_METADATA_UPDATED
#define AVSTREAM_EVENT_FLAG_METADATA_UPDATED
Definition: avformat.h:999
id3_has_changed_values
static int id3_has_changed_values(struct playlist *pls, AVDictionary *metadata, ID3v2ExtraMetaAPIC *apic)
Definition: hls.c:1064
c
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
Definition: undefined.txt:32
AVFormatContext::nb_streams
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
Definition: avformat.h:1288
av_strncasecmp
int av_strncasecmp(const char *a, const char *b, size_t n)
Locale-independent case-insensitive compare.
Definition: avstring.c:225
playlist::init_sec_buf_size
unsigned int init_sec_buf_size
Definition: hls.c:129
av_rescale_rnd
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.
Definition: mathematics.c:58
options
const OptionDef options[]
avformat_find_stream_info
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options)
Read packets of a media file to get stream information.
Definition: utils.c:3602
find_timestamp_in_playlist
static int find_timestamp_in_playlist(HLSContext *c, struct playlist *pls, int64_t timestamp, int64_t *seq_no)
Definition: hls.c:1648
AVIOContext
Bytestream IO Context.
Definition: avio.h:161
rendition_info::forced
char forced[4]
Definition: hls.c:464
ffio_init_context
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))
Definition: aviobuf.c:88
AVMediaType
AVMediaType
Definition: avutil.h:199
playlist::pb
AVIOContext pb
Definition: hls.c:95
AVPacket::size
int size
Definition: packet.h:370
playlist::cur_init_section
struct segment * cur_init_section
Definition: hls.c:127
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:117
avformat_alloc_context
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
Definition: options.c:211
AVIOContext::buf_end
unsigned char * buf_end
End of the data, may be less than buffer+buffer_size if the read function returned less data than req...
Definition: avio.h:229
new_rendition
static struct rendition * new_rendition(HLSContext *c, struct rendition_info *info, const char *url_base)
Definition: hls.c:468
av_err2str
#define av_err2str(errnum)
Convenience macro, the return value should be used only directly in function arguments but never stan...
Definition: error.h:119
HLSContext::first_timestamp
int64_t first_timestamp
Definition: hls.c:206
FFMAX
#define FFMAX(a, b)
Definition: common.h:103
avpriv_set_pts_info
void avpriv_set_pts_info(AVStream *s, int pts_wrap_bits, unsigned int pts_num, unsigned int pts_den)
Set the time base and wrapping info for a given stream.
Definition: utils.c:4945
ff_copy_whiteblacklists
int ff_copy_whiteblacklists(AVFormatContext *dst, const AVFormatContext *src)
Copies the whilelists from one context to the other.
Definition: utils.c:160
playlist::cur_seg_offset
int64_t cur_seg_offset
Definition: hls.c:123
size
int size
Definition: twinvq_data.h:10344
ID3v2_DEFAULT_MAGIC
#define ID3v2_DEFAULT_MAGIC
Default magic bytes for ID3v2 header: "ID3".
Definition: id3v2.h:35
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:248
avpriv_report_missing_feature
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
AVStream::event_flags
int event_flags
Flags indicating events happening on the stream, a combination of AVSTREAM_EVENT_FLAG_*.
Definition: avformat.h:992
save_avio_options
static int save_avio_options(AVFormatContext *s)
Definition: hls.c:1713
rendition_info::characteristics
char characteristics[MAX_CHARACTERISTICS_LEN]
Definition: hls.c:465
AV_OPT_ALLOW_NULL
#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...
Definition: opt.h:574
PLS_TYPE_EVENT
@ PLS_TYPE_EVENT
Definition: hls.c:84
AVMEDIA_TYPE_UNKNOWN
@ AVMEDIA_TYPE_UNKNOWN
Usually treated as AVMEDIA_TYPE_DATA.
Definition: avutil.h:200
get_timebase
static AVRational get_timebase(struct playlist *pls)
Definition: hls.c:2140
AV_OPT_SEARCH_CHILDREN
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition: opt.h:560
AV_DISPOSITION_HEARING_IMPAIRED
#define AV_DISPOSITION_HEARING_IMPAIRED
stream for hearing impaired audiences
Definition: avformat.h:831
AVPacket::dts
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed.
Definition: packet.h:368
FFMIN
#define FFMIN(a, b)
Definition: common.h:105
update_init_section
static int update_init_section(struct playlist *pls, struct segment *seg)
Definition: hls.c:1322
line
Definition: graph2dot.c:48
playlist::id3_found
int id3_found
Definition: hls.c:144
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition: packet.h:375
av_packet_alloc
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition: avpacket.c:64
av_dict_free
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
Definition: dict.c:203
av_strstart
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
Definition: avstring.c:34
playlist::seek_flags
int seek_flags
Definition: hls.c:149
read_data
static int read_data(void *opaque, uint8_t *buf, int buf_size)
Definition: hls.c:1432
ID3v2ExtraMetaAPIC
Definition: id3v2.h:65
rendition::playlist
struct playlist * playlist
Definition: hls.c:173
playlist::ctx
AVFormatContext * ctx
Definition: hls.c:103
AV_LOG_INFO
#define AV_LOG_INFO
Standard information.
Definition: log.h:205
free_segment_list
static void free_segment_list(struct playlist *pls)
Definition: hls.c:228
AVStream::side_data
AVPacketSideData * side_data
An array of side data that applies to the whole stream (i.e.
Definition: avformat.h:975
init_section_info::uri
char uri[MAX_URL_SIZE]
Definition: hls.c:396
avcodec_parameters_copy
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Copy the contents of src to dst.
Definition: codec_par.c:72
add_metadata_from_renditions
static void add_metadata_from_renditions(AVFormatContext *s, struct playlist *pls, enum AVMediaType type)
Definition: hls.c:1616
in
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
Definition: audio_convert.c:326
key_info::method
char method[11]
Definition: hls.c:376
next_segment
static struct segment * next_segment(struct playlist *pls)
Definition: hls.c:1013
PLS_TYPE_UNSPECIFIED
@ PLS_TYPE_UNSPECIFIED
Definition: hls.c:83
i
int i
Definition: input.c:407
URLContext
Definition: url.h:38
playlist::key
uint8_t key[16]
Definition: hls.c:134
update_noheader_flag
static void update_noheader_flag(AVFormatContext *s)
Definition: hls.c:1829
AVPacket::pts
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
Definition: packet.h:362
avio_internal.h
playlist::needed
int needed
Definition: hls.c:118
avformat_open_input
int avformat_open_input(AVFormatContext **ps, const char *url, ff_const59 AVInputFormat *fmt, AVDictionary **options)
Open an input stream and read the header.
Definition: utils.c:512
rendition::name
char name[MAX_FIELD_LEN]
Definition: hls.c:176
AV_TIME_BASE
#define AV_TIME_BASE
Internal time base represented as integer.
Definition: avutil.h:254
rendition
Definition: hls.c:171
ff_id3v2_read_dict
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.
Definition: id3v2.c:1114
select_cur_seq_no
static int64_t select_cur_seq_no(HLSContext *c, struct playlist *pls)
Definition: hls.c:1674
HLSContext::m3u8_hold_counters
int m3u8_hold_counters
Definition: hls.c:203
variant::video_group
char video_group[MAX_FIELD_LEN]
Definition: hls.c:188
AV_ROUND_DOWN
@ AV_ROUND_DOWN
Round toward -infinity.
Definition: mathematics.h:82
HLSContext
Definition: hls.c:192
uint8_t
uint8_t
Definition: audio_convert.c:194
default_reload_interval
static int64_t default_reload_interval(struct playlist *pls)
Definition: hls.c:1379
tb
#define tb
Definition: regdef.h:68
av_mallocz
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
Definition: mem.c:237
AVProgram
New fields can be added to the end with minor version bumps.
Definition: avformat.h:1150
len
int len
Definition: vorbis_enc_data.h:452
HLSContext::ctx
AVFormatContext * ctx
Definition: hls.c:194
ID3v2ExtraMetaPRIV::datasize
uint32_t datasize
Definition: id3v2.h:75
open_url_keepalive
static int open_url_keepalive(AVFormatContext *s, AVIOContext **pb, const char *url, AVDictionary **options)
Definition: hls.c:606
free_playlist_list
static void free_playlist_list(HLSContext *c)
Definition: hls.c:246
PlaylistType
PlaylistType
Definition: hls.c:82
rendition_info::language
char language[MAX_FIELD_LEN]
Definition: hls.c:460
playlist::parent
AVFormatContext * parent
Definition: hls.c:101
AVStream::disposition
int disposition
AV_DISPOSITION_* bit field.
Definition: avformat.h:926
AV_DISPOSITION_VISUAL_IMPAIRED
#define AV_DISPOSITION_VISUAL_IMPAIRED
stream for visual impaired audiences
Definition: avformat.h:832
HLSContext::http_persistent
int http_persistent
Definition: hls.c:212
ff_id3v2_tag_len
int ff_id3v2_tag_len(const uint8_t *buf)
Get the length of an ID3v2 tag.
Definition: id3v2.c:156
av_compare_mod
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.
Definition: mathematics.c:160
AVStream::id
int id
Format-specific stream ID.
Definition: avformat.h:880
ret
ret
Definition: filter_design.txt:187
read_packet
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
Definition: avio_reading.c:42
AVStream
Stream structure.
Definition: avformat.h:873
playlist::index
int index
Definition: hls.c:102
avio_seek
int64_t avio_seek(AVIOContext *s, int64_t offset, int whence)
fseek() equivalent for AVIOContext.
Definition: aviobuf.c:253
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:72
AVStream::nb_side_data
int nb_side_data
The number of elements in the AVStream.side_data array.
Definition: avformat.h:979
pos
unsigned int pos
Definition: spdifenc.c:412
avformat.h
dict.h
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition: avcodec.h:215
playlist::m3u8_hold_counters
int m3u8_hold_counters
Definition: hls.c:122
AV_DICT_MATCH_CASE
#define AV_DICT_MATCH_CASE
Only get an entry with exact-case key match.
Definition: dict.h:69
open_input
static int open_input(HLSContext *c, struct playlist *pls, struct segment *seg, AVIOContext **in)
Definition: hls.c:1235
hls_read_seek
static int hls_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Definition: hls.c:2293
new_playlist
static struct playlist * new_playlist(HLSContext *c, const char *url, const char *base)
Definition: hls.c:296
HLSContext::live_start_index
int live_start_index
Definition: hls.c:204
set_stream_info_from_input_stream
static int set_stream_info_from_input_stream(AVStream *st, struct playlist *pls, AVStream *ist)
Definition: hls.c:1771
ID3v2ExtraMeta::data
union ID3v2ExtraMeta::@258 data
AVStream::index
int index
stream index in AVFormatContext
Definition: avformat.h:874
playlist::main_streams
AVStream ** main_streams
Definition: hls.c:109
MAX_URL_SIZE
#define MAX_URL_SIZE
Definition: internal.h:30
playlist::id3_initial
AVDictionary * id3_initial
Definition: hls.c:143
parse_playlist
static int parse_playlist(HLSContext *c, const char *url, struct playlist *pls, AVIOContext *in)
Definition: hls.c:711
rendition_info
Definition: hls.c:456
AVRational::den
int den
Denominator.
Definition: rational.h:60
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition: opt.h:225
init_section_info::byterange
char byterange[32]
Definition: hls.c:397
avformat_free_context
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
Definition: utils.c:4436
AVFMT_NOGENSEARCH
#define AVFMT_NOGENSEARCH
Format does not allow to fall back on generic search.
Definition: avformat.h:469
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:633
ff_parse_key_val_cb
void(* ff_parse_key_val_cb)(void *context, const char *key, int key_len, char **dest, int *dest_len)
Callback function type for ff_parse_key_value.
Definition: internal.h:511
ff_hls_demuxer
AVInputFormat ff_hls_demuxer
Definition: hls.c:2418
AVFormatContext::io_open
int(* io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, AVDictionary **options)
A callback for opening new IO streams.
Definition: avformat.h:1828
AVIOContext::eof_reached
int eof_reached
true if was unable to read due to error or eof
Definition: avio.h:239
playlist::last_seq_no
int64_t last_seq_no
Definition: hls.c:121
variant::bandwidth
int bandwidth
Definition: hls.c:181
AVPacket::stream_index
int stream_index
Definition: packet.h:371
segment
Definition: hls.c:68
av_dict_set_int
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.
Definition: dict.c:147
ff_format_io_close
void ff_format_io_close(AVFormatContext *s, AVIOContext **pb)
Definition: utils.c:5692
AVIO_FLAG_READ
#define AVIO_FLAG_READ
read-only
Definition: avio.h:674
add_stream_to_programs
static void add_stream_to_programs(AVFormatContext *s, struct playlist *pls, AVStream *stream)
Definition: hls.c:1745
av_strdup
char * av_strdup(const char *s)
Duplicate a string.
Definition: mem.c:253
hls_probe
static int hls_probe(const AVProbeData *p)
Definition: hls.c:2375
rendition_info::name
char name[MAX_FIELD_LEN]
Definition: hls.c:462
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:201
playlist::is_id3_timestamped
int is_id3_timestamped
Definition: hls.c:138
AVFMT_TS_DISCONT
#define AVFMT_TS_DISCONT
Format allows timestamp discontinuities.
Definition: avformat.h:464
AVStreamInternal::need_context_update
int need_context_update
Whether the internal avctx needs to be updated from codecpar (after a late change to codecpar)
Definition: internal.h:200
playlist::init_sec_data_len
unsigned int init_sec_data_len
Definition: hls.c:130
hls_read_packet
static int hls_read_packet(AVFormatContext *s, AVPacket *pkt)
Definition: hls.c:2157
AVIOContext::buffer
unsigned char * buffer
Start of the buffer.
Definition: avio.h:226
handle_variant_args
static void handle_variant_args(struct variant_info *info, const char *key, int key_len, char **dest, int *dest_len)
Definition: hls.c:356
diff
static av_always_inline int diff(const uint32_t a, const uint32_t b)
Definition: vf_palettegen.c:136
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
AVDictionaryEntry
Definition: dict.h:81
av_probe_input_buffer
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.
Definition: format.c:312
ff_make_absolute_url
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.
Definition: url.c:319
variant_info::bandwidth
char bandwidth[20]
Definition: hls.c:323
AVCodecParameters::codec_id
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
Definition: codec_par.h:60
AVPacket
This structure stores compressed data.
Definition: packet.h:346
ff_read_frame_flush
void ff_read_frame_flush(AVFormatContext *s)
Flush the frame reader.
Definition: utils.c:1892
AV_OPT_TYPE_BOOL
@ AV_OPT_TYPE_BOOL
Definition: opt.h:242
segment::url
char * url
Definition: hls.c:72
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_dict_set
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
Definition: dict.c:70
av_fast_malloc
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
Definition: mem.c:502
av_dict_copy
int av_dict_copy(AVDictionary **dst, const AVDictionary *src, int flags)
Copy entries from one AVDictionary struct into another.
Definition: dict.c:217
ff_id3v2_free_extra_meta
void ff_id3v2_free_extra_meta(ID3v2ExtraMeta **extra_meta)
Free memory allocated parsing special (non-text) metadata.
Definition: id3v2.c:1126
segment::init_section
struct segment * init_section
Definition: hls.c:77
av_stream_new_side_data
uint8_t * av_stream_new_side_data(AVStream *stream, enum AVPacketSideDataType type, size_t size)
Allocate new information from stream.
avio_find_protocol_name
const char * avio_find_protocol_name(const char *url)
Return the name of the protocol that will handle the passed URL.
Definition: avio.c:470
flags
#define flags(name, subs,...)
Definition: cbs_av1.c:561
AVERROR_BUG
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:50
av_strlcpy
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.
Definition: avstring.c:83
av_opt_get
int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
Definition: opt.c:779
playlist::last_load_time
int64_t last_load_time
Definition: hls.c:124
ff_id3v2_parse_priv
int ff_id3v2_parse_priv(AVFormatContext *s, ID3v2ExtraMeta *extra_meta)
Add metadata for all PRIV tags in the ID3v2 header.
Definition: id3v2.c:1273
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:28
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
rendition::disposition
int disposition
Definition: hls.c:177
playlist::url
char url[MAX_URL_SIZE]
Definition: hls.c:94
AVERROR_EXIT
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
Definition: error.h:56
playlist::id3_changed
int id3_changed
Definition: hls.c:145
AVDictionaryEntry::value
char * value
Definition: dict.h:83
segment::iv
uint8_t iv[16]
Definition: hls.c:75
avstring.h
AV_OPT_TYPE_STRING
@ AV_OPT_TYPE_STRING
Definition: opt.h:229
handle_key_args
static void handle_key_args(struct key_info *info, const char *key, int key_len, char **dest, int *dest_len)
Definition: hls.c:380
AVStream::pts_wrap_bits
int pts_wrap_bits
number of bits in pts (used for wrapping control)
Definition: avformat.h:1055
http.h
AVIOContext::buf_ptr
unsigned char * buf_ptr
Current position in the buffer.
Definition: avio.h:228
read_from_url
static int read_from_url(struct playlist *pls, struct segment *seg, uint8_t *buf, int buf_size)
Definition: hls.c:1021
ff_id3v2_parse_priv_dict
int ff_id3v2_parse_priv_dict(AVDictionary **metadata, ID3v2ExtraMeta *extra_meta)
Parse PRIV tags into a dictionary.
Definition: id3v2.c:1233
AVERROR_PROTOCOL_NOT_FOUND
#define AVERROR_PROTOCOL_NOT_FOUND
Protocol not found.
Definition: error.h:63
snprintf
#define snprintf
Definition: snprintf.h:34
AVFormatContext::priv_data
void * priv_data
Format private data.
Definition: avformat.h:1260
intercept_id3
static void intercept_id3(struct playlist *pls, uint8_t *buf, int buf_size, int *len)
Definition: hls.c:1135
rendition::language
char language[MAX_FIELD_LEN]
Definition: hls.c:175
ID3v2ExtraMetaPRIV
Definition: id3v2.h:72
ffio_geturlcontext
URLContext * ffio_geturlcontext(AVIOContext *s)
Return the URLContext associated with the AVIOContext.
Definition: aviobuf.c:979
AV_RB64
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
Definition: bytestream.h:95
ID3v2ExtraMetaPRIV::owner
uint8_t * owner
Definition: id3v2.h:73
HLSContext::renditions
struct rendition ** renditions
Definition: hls.c:200
AVFMT_EVENT_FLAG_METADATA_UPDATED
#define AVFMT_EVENT_FLAG_METADATA_UPDATED
Definition: avformat.h:1562
rendition_info::group_id
char group_id[MAX_FIELD_LEN]
Definition: hls.c:459
ff_id3v2_match
int ff_id3v2_match(const uint8_t *buf, const char *magic)
Detect ID3v2 Header.
Definition: id3v2.c:143
key_info
Definition: hls.c:374
playlist::pkt
AVPacket * pkt
Definition: hls.c:104
ff_parse_key_value
void ff_parse_key_value(const char *str, ff_parse_key_val_cb callback_get_buf, void *context)
Parse a string with comma-separated key=value pairs.
Definition: utils.c:4975
playlist::has_noheader_flag
int has_noheader_flag
Definition: hls.c:105
avio_feof
int avio_feof(AVIOContext *s)
Similar to feof() but also returns nonzero on read errors.
Definition: aviobuf.c:364
av_program_add_stream_index
void av_program_add_stream_index(AVFormatContext *ac, int progid, unsigned int idx)
ID3v2ExtraMeta::priv
ID3v2ExtraMetaPRIV priv
Definition: id3v2.h:91