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