You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

867 lines
27KB

  1. /*
  2. * Apple HTTP Live Streaming demuxer
  3. * Copyright (c) 2010 Martin Storsjo
  4. *
  5. * This file is part of Libav.
  6. *
  7. * Libav is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public
  9. * License as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * Libav is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. * Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public
  18. * License along with Libav; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. /**
  22. * @file
  23. * Apple HTTP Live Streaming demuxer
  24. * http://tools.ietf.org/html/draft-pantos-http-live-streaming
  25. */
  26. #include "libavutil/avstring.h"
  27. #include "libavutil/intreadwrite.h"
  28. #include "libavutil/mathematics.h"
  29. #include "libavutil/opt.h"
  30. #include "libavutil/dict.h"
  31. #include "libavutil/time.h"
  32. #include "avformat.h"
  33. #include "internal.h"
  34. #include "avio_internal.h"
  35. #include "url.h"
  36. #define INITIAL_BUFFER_SIZE 32768
  37. /*
  38. * An apple http stream consists of a playlist with media segment files,
  39. * played sequentially. There may be several playlists with the same
  40. * video content, in different bandwidth variants, that are played in
  41. * parallel (preferably only one bandwidth variant at a time). In this case,
  42. * the user supplied the url to a main playlist that only lists the variant
  43. * playlists.
  44. *
  45. * If the main playlist doesn't point at any variants, we still create
  46. * one anonymous toplevel variant for this, to maintain the structure.
  47. */
  48. enum KeyType {
  49. KEY_NONE,
  50. KEY_AES_128,
  51. };
  52. struct segment {
  53. int64_t duration;
  54. char url[MAX_URL_SIZE];
  55. char key[MAX_URL_SIZE];
  56. enum KeyType key_type;
  57. uint8_t iv[16];
  58. };
  59. /*
  60. * Each variant has its own demuxer. If it currently is active,
  61. * it has an open AVIOContext too, and potentially an AVPacket
  62. * containing the next packet from this stream.
  63. */
  64. struct variant {
  65. int bandwidth;
  66. char url[MAX_URL_SIZE];
  67. AVIOContext pb;
  68. uint8_t* read_buffer;
  69. URLContext *input;
  70. AVFormatContext *parent;
  71. int index;
  72. AVFormatContext *ctx;
  73. AVPacket pkt;
  74. int stream_offset;
  75. int finished;
  76. int64_t target_duration;
  77. int start_seq_no;
  78. int n_segments;
  79. struct segment **segments;
  80. int needed, cur_needed;
  81. int cur_seq_no;
  82. int64_t last_load_time;
  83. char key_url[MAX_URL_SIZE];
  84. uint8_t key[16];
  85. };
  86. typedef struct HLSContext {
  87. AVFormatContext *ctx;
  88. int n_variants;
  89. struct variant **variants;
  90. int cur_seq_no;
  91. int end_of_segment;
  92. int first_packet;
  93. int64_t first_timestamp;
  94. int64_t seek_timestamp;
  95. int seek_flags;
  96. AVIOInterruptCB *interrupt_callback;
  97. AVDictionary *avio_opts;
  98. } HLSContext;
  99. static int read_chomp_line(AVIOContext *s, char *buf, int maxlen)
  100. {
  101. int len = ff_get_line(s, buf, maxlen);
  102. while (len > 0 && av_isspace(buf[len - 1]))
  103. buf[--len] = '\0';
  104. return len;
  105. }
  106. static void free_segment_list(struct variant *var)
  107. {
  108. int i;
  109. for (i = 0; i < var->n_segments; i++)
  110. av_free(var->segments[i]);
  111. av_freep(&var->segments);
  112. var->n_segments = 0;
  113. }
  114. static void free_variant_list(HLSContext *c)
  115. {
  116. int i;
  117. for (i = 0; i < c->n_variants; i++) {
  118. struct variant *var = c->variants[i];
  119. free_segment_list(var);
  120. av_packet_unref(&var->pkt);
  121. av_free(var->pb.buffer);
  122. if (var->input)
  123. ffurl_close(var->input);
  124. if (var->ctx) {
  125. var->ctx->pb = NULL;
  126. avformat_close_input(&var->ctx);
  127. }
  128. av_free(var);
  129. }
  130. av_freep(&c->variants);
  131. c->n_variants = 0;
  132. }
  133. /*
  134. * Used to reset a statically allocated AVPacket to a clean slate,
  135. * containing no data.
  136. */
  137. static void reset_packet(AVPacket *pkt)
  138. {
  139. av_init_packet(pkt);
  140. pkt->data = NULL;
  141. }
  142. static struct variant *new_variant(HLSContext *c, int bandwidth,
  143. const char *url, const char *base)
  144. {
  145. struct variant *var = av_mallocz(sizeof(struct variant));
  146. if (!var)
  147. return NULL;
  148. reset_packet(&var->pkt);
  149. var->bandwidth = bandwidth;
  150. ff_make_absolute_url(var->url, sizeof(var->url), base, url);
  151. dynarray_add(&c->variants, &c->n_variants, var);
  152. return var;
  153. }
  154. struct variant_info {
  155. char bandwidth[20];
  156. };
  157. static void handle_variant_args(struct variant_info *info, const char *key,
  158. int key_len, char **dest, int *dest_len)
  159. {
  160. if (!strncmp(key, "BANDWIDTH=", key_len)) {
  161. *dest = info->bandwidth;
  162. *dest_len = sizeof(info->bandwidth);
  163. }
  164. }
  165. struct key_info {
  166. char uri[MAX_URL_SIZE];
  167. char method[10];
  168. char iv[35];
  169. };
  170. static void handle_key_args(struct key_info *info, const char *key,
  171. int key_len, char **dest, int *dest_len)
  172. {
  173. if (!strncmp(key, "METHOD=", key_len)) {
  174. *dest = info->method;
  175. *dest_len = sizeof(info->method);
  176. } else if (!strncmp(key, "URI=", key_len)) {
  177. *dest = info->uri;
  178. *dest_len = sizeof(info->uri);
  179. } else if (!strncmp(key, "IV=", key_len)) {
  180. *dest = info->iv;
  181. *dest_len = sizeof(info->iv);
  182. }
  183. }
  184. static int open_in(HLSContext *c, AVIOContext **in, const char *url)
  185. {
  186. AVDictionary *tmp = NULL;
  187. int ret;
  188. av_dict_copy(&tmp, c->avio_opts, 0);
  189. ret = c->ctx->io_open(c->ctx, in, url, AVIO_FLAG_READ, &tmp);
  190. av_dict_free(&tmp);
  191. return ret;
  192. }
  193. static int url_connect(struct variant *var, AVDictionary *opts)
  194. {
  195. AVDictionary *tmp = NULL;
  196. int ret;
  197. av_dict_copy(&tmp, opts, 0);
  198. if ((ret = av_opt_set_dict(var->input, &tmp)) < 0 ||
  199. (ret = ffurl_connect(var->input, NULL)) < 0) {
  200. ffurl_close(var->input);
  201. var->input = NULL;
  202. }
  203. av_dict_free(&tmp);
  204. return ret;
  205. }
  206. static int open_url(HLSContext *c, URLContext **uc, const char *url)
  207. {
  208. AVDictionary *tmp = NULL;
  209. int ret;
  210. av_dict_copy(&tmp, c->avio_opts, 0);
  211. ret = ffurl_open(uc, url, AVIO_FLAG_READ, c->interrupt_callback, &tmp);
  212. av_dict_free(&tmp);
  213. return ret;
  214. }
  215. static int parse_playlist(HLSContext *c, const char *url,
  216. struct variant *var, AVIOContext *in)
  217. {
  218. int ret = 0, is_segment = 0, is_variant = 0, bandwidth = 0;
  219. int64_t duration = 0;
  220. enum KeyType key_type = KEY_NONE;
  221. uint8_t iv[16] = "";
  222. int has_iv = 0;
  223. char key[MAX_URL_SIZE] = "";
  224. char line[1024];
  225. const char *ptr;
  226. int close_in = 0;
  227. uint8_t *new_url = NULL;
  228. if (!in) {
  229. ret = open_in(c, &in, url);
  230. if (ret < 0)
  231. return ret;
  232. close_in = 1;
  233. }
  234. if (av_opt_get(in, "location", AV_OPT_SEARCH_CHILDREN, &new_url) >= 0)
  235. url = new_url;
  236. read_chomp_line(in, line, sizeof(line));
  237. if (strcmp(line, "#EXTM3U")) {
  238. ret = AVERROR_INVALIDDATA;
  239. goto fail;
  240. }
  241. if (var) {
  242. free_segment_list(var);
  243. var->finished = 0;
  244. }
  245. while (!in->eof_reached) {
  246. read_chomp_line(in, line, sizeof(line));
  247. if (av_strstart(line, "#EXT-X-STREAM-INF:", &ptr)) {
  248. struct variant_info info = {{0}};
  249. is_variant = 1;
  250. ff_parse_key_value(ptr, (ff_parse_key_val_cb) handle_variant_args,
  251. &info);
  252. bandwidth = atoi(info.bandwidth);
  253. } else if (av_strstart(line, "#EXT-X-KEY:", &ptr)) {
  254. struct key_info info = {{0}};
  255. ff_parse_key_value(ptr, (ff_parse_key_val_cb) handle_key_args,
  256. &info);
  257. key_type = KEY_NONE;
  258. has_iv = 0;
  259. if (!strcmp(info.method, "AES-128"))
  260. key_type = KEY_AES_128;
  261. if (!strncmp(info.iv, "0x", 2) || !strncmp(info.iv, "0X", 2)) {
  262. ff_hex_to_data(iv, info.iv + 2);
  263. has_iv = 1;
  264. }
  265. av_strlcpy(key, info.uri, sizeof(key));
  266. } else if (av_strstart(line, "#EXT-X-TARGETDURATION:", &ptr)) {
  267. if (!var) {
  268. var = new_variant(c, 0, url, NULL);
  269. if (!var) {
  270. ret = AVERROR(ENOMEM);
  271. goto fail;
  272. }
  273. }
  274. var->target_duration = atoi(ptr) * AV_TIME_BASE;
  275. } else if (av_strstart(line, "#EXT-X-MEDIA-SEQUENCE:", &ptr)) {
  276. if (!var) {
  277. var = new_variant(c, 0, url, NULL);
  278. if (!var) {
  279. ret = AVERROR(ENOMEM);
  280. goto fail;
  281. }
  282. }
  283. var->start_seq_no = atoi(ptr);
  284. } else if (av_strstart(line, "#EXT-X-ENDLIST", &ptr)) {
  285. if (var)
  286. var->finished = 1;
  287. } else if (av_strstart(line, "#EXTINF:", &ptr)) {
  288. is_segment = 1;
  289. duration = atof(ptr) * AV_TIME_BASE;
  290. } else if (av_strstart(line, "#", NULL)) {
  291. continue;
  292. } else if (line[0]) {
  293. if (is_variant) {
  294. if (!new_variant(c, bandwidth, line, url)) {
  295. ret = AVERROR(ENOMEM);
  296. goto fail;
  297. }
  298. is_variant = 0;
  299. bandwidth = 0;
  300. }
  301. if (is_segment) {
  302. struct segment *seg;
  303. if (!var) {
  304. var = new_variant(c, 0, url, NULL);
  305. if (!var) {
  306. ret = AVERROR(ENOMEM);
  307. goto fail;
  308. }
  309. }
  310. seg = av_malloc(sizeof(struct segment));
  311. if (!seg) {
  312. ret = AVERROR(ENOMEM);
  313. goto fail;
  314. }
  315. seg->duration = duration;
  316. seg->key_type = key_type;
  317. if (has_iv) {
  318. memcpy(seg->iv, iv, sizeof(iv));
  319. } else {
  320. int seq = var->start_seq_no + var->n_segments;
  321. memset(seg->iv, 0, sizeof(seg->iv));
  322. AV_WB32(seg->iv + 12, seq);
  323. }
  324. ff_make_absolute_url(seg->key, sizeof(seg->key), url, key);
  325. ff_make_absolute_url(seg->url, sizeof(seg->url), url, line);
  326. dynarray_add(&var->segments, &var->n_segments, seg);
  327. is_segment = 0;
  328. }
  329. }
  330. }
  331. if (var)
  332. var->last_load_time = av_gettime_relative();
  333. fail:
  334. av_free(new_url);
  335. if (close_in)
  336. ff_format_io_close(c->ctx, &in);
  337. return ret;
  338. }
  339. static int open_input(struct variant *var)
  340. {
  341. struct segment *seg = var->segments[var->cur_seq_no - var->start_seq_no];
  342. if (seg->key_type == KEY_NONE) {
  343. return open_url(var->parent->priv_data, &var->input, seg->url);
  344. } else if (seg->key_type == KEY_AES_128) {
  345. HLSContext *c = var->parent->priv_data;
  346. char iv[33], key[33], url[MAX_URL_SIZE];
  347. int ret;
  348. if (strcmp(seg->key, var->key_url)) {
  349. URLContext *uc;
  350. if (open_url(var->parent->priv_data, &uc, seg->key) == 0) {
  351. if (ffurl_read_complete(uc, var->key, sizeof(var->key))
  352. != sizeof(var->key)) {
  353. av_log(NULL, AV_LOG_ERROR, "Unable to read key file %s\n",
  354. seg->key);
  355. }
  356. ffurl_close(uc);
  357. } else {
  358. av_log(NULL, AV_LOG_ERROR, "Unable to open key file %s\n",
  359. seg->key);
  360. }
  361. av_strlcpy(var->key_url, seg->key, sizeof(var->key_url));
  362. }
  363. ff_data_to_hex(iv, seg->iv, sizeof(seg->iv), 0);
  364. ff_data_to_hex(key, var->key, sizeof(var->key), 0);
  365. iv[32] = key[32] = '\0';
  366. if (strstr(seg->url, "://"))
  367. snprintf(url, sizeof(url), "crypto+%s", seg->url);
  368. else
  369. snprintf(url, sizeof(url), "crypto:%s", seg->url);
  370. if ((ret = ffurl_alloc(&var->input, url, AVIO_FLAG_READ,
  371. &var->parent->interrupt_callback)) < 0)
  372. return ret;
  373. av_opt_set(var->input->priv_data, "key", key, 0);
  374. av_opt_set(var->input->priv_data, "iv", iv, 0);
  375. return url_connect(var, c->avio_opts);
  376. }
  377. return AVERROR(ENOSYS);
  378. }
  379. static int read_data(void *opaque, uint8_t *buf, int buf_size)
  380. {
  381. struct variant *v = opaque;
  382. HLSContext *c = v->parent->priv_data;
  383. int ret, i;
  384. restart:
  385. if (!v->input) {
  386. /* If this is a live stream and the reload interval has elapsed since
  387. * the last playlist reload, reload the variant playlists now. */
  388. int64_t reload_interval = v->n_segments > 0 ?
  389. v->segments[v->n_segments - 1]->duration :
  390. v->target_duration;
  391. reload:
  392. if (!v->finished &&
  393. av_gettime_relative() - v->last_load_time >= reload_interval) {
  394. if ((ret = parse_playlist(c, v->url, v, NULL)) < 0)
  395. return ret;
  396. /* If we need to reload the playlist again below (if
  397. * there's still no more segments), switch to a reload
  398. * interval of half the target duration. */
  399. reload_interval = v->target_duration / 2;
  400. }
  401. if (v->cur_seq_no < v->start_seq_no) {
  402. av_log(NULL, AV_LOG_WARNING,
  403. "skipping %d segments ahead, expired from playlists\n",
  404. v->start_seq_no - v->cur_seq_no);
  405. v->cur_seq_no = v->start_seq_no;
  406. }
  407. if (v->cur_seq_no >= v->start_seq_no + v->n_segments) {
  408. if (v->finished)
  409. return AVERROR_EOF;
  410. while (av_gettime_relative() - v->last_load_time < reload_interval) {
  411. if (ff_check_interrupt(c->interrupt_callback))
  412. return AVERROR_EXIT;
  413. av_usleep(100*1000);
  414. }
  415. /* Enough time has elapsed since the last reload */
  416. goto reload;
  417. }
  418. ret = open_input(v);
  419. if (ret < 0)
  420. return ret;
  421. }
  422. ret = ffurl_read(v->input, buf, buf_size);
  423. if (ret > 0)
  424. return ret;
  425. ffurl_close(v->input);
  426. v->input = NULL;
  427. v->cur_seq_no++;
  428. c->end_of_segment = 1;
  429. c->cur_seq_no = v->cur_seq_no;
  430. if (v->ctx && v->ctx->nb_streams &&
  431. v->parent->nb_streams >= v->stream_offset + v->ctx->nb_streams) {
  432. v->needed = 0;
  433. for (i = v->stream_offset; i < v->stream_offset + v->ctx->nb_streams;
  434. i++) {
  435. if (v->parent->streams[i]->discard < AVDISCARD_ALL)
  436. v->needed = 1;
  437. }
  438. }
  439. if (!v->needed) {
  440. av_log(v->parent, AV_LOG_INFO, "No longer receiving variant %d\n",
  441. v->index);
  442. return AVERROR_EOF;
  443. }
  444. goto restart;
  445. }
  446. static int save_avio_options(AVFormatContext *s)
  447. {
  448. HLSContext *c = s->priv_data;
  449. const char *opts[] = { "headers", "user_agent", NULL }, **opt = opts;
  450. uint8_t *buf;
  451. int ret = 0;
  452. while (*opt) {
  453. if (av_opt_get(s->pb, *opt, AV_OPT_SEARCH_CHILDREN, &buf) >= 0) {
  454. ret = av_dict_set(&c->avio_opts, *opt, buf,
  455. AV_DICT_DONT_STRDUP_VAL);
  456. if (ret < 0)
  457. return ret;
  458. }
  459. opt++;
  460. }
  461. return ret;
  462. }
  463. static int hls_read_header(AVFormatContext *s)
  464. {
  465. HLSContext *c = s->priv_data;
  466. int ret = 0, i, j, stream_offset = 0;
  467. c->ctx = s;
  468. c->interrupt_callback = &s->interrupt_callback;
  469. if ((ret = parse_playlist(c, s->filename, NULL, s->pb)) < 0)
  470. goto fail;
  471. if ((ret = save_avio_options(s)) < 0)
  472. goto fail;
  473. if (c->n_variants == 0) {
  474. av_log(NULL, AV_LOG_WARNING, "Empty playlist\n");
  475. ret = AVERROR_EOF;
  476. goto fail;
  477. }
  478. /* If the playlist only contained variants, parse each individual
  479. * variant playlist. */
  480. if (c->n_variants > 1 || c->variants[0]->n_segments == 0) {
  481. for (i = 0; i < c->n_variants; i++) {
  482. struct variant *v = c->variants[i];
  483. if ((ret = parse_playlist(c, v->url, v, NULL)) < 0)
  484. goto fail;
  485. }
  486. }
  487. if (c->variants[0]->n_segments == 0) {
  488. av_log(NULL, AV_LOG_WARNING, "Empty playlist\n");
  489. ret = AVERROR_EOF;
  490. goto fail;
  491. }
  492. /* If this isn't a live stream, calculate the total duration of the
  493. * stream. */
  494. if (c->variants[0]->finished) {
  495. int64_t duration = 0;
  496. for (i = 0; i < c->variants[0]->n_segments; i++)
  497. duration += c->variants[0]->segments[i]->duration;
  498. s->duration = duration;
  499. }
  500. /* Open the demuxer for each variant */
  501. for (i = 0; i < c->n_variants; i++) {
  502. struct variant *v = c->variants[i];
  503. AVInputFormat *in_fmt = NULL;
  504. char bitrate_str[20];
  505. AVProgram *program;
  506. if (v->n_segments == 0)
  507. continue;
  508. if (!(v->ctx = avformat_alloc_context())) {
  509. ret = AVERROR(ENOMEM);
  510. goto fail;
  511. }
  512. v->index = i;
  513. v->needed = 1;
  514. v->parent = s;
  515. /* If this is a live stream with more than 3 segments, start at the
  516. * third last segment. */
  517. v->cur_seq_no = v->start_seq_no;
  518. if (!v->finished && v->n_segments > 3)
  519. v->cur_seq_no = v->start_seq_no + v->n_segments - 3;
  520. v->read_buffer = av_malloc(INITIAL_BUFFER_SIZE);
  521. ffio_init_context(&v->pb, v->read_buffer, INITIAL_BUFFER_SIZE, 0, v,
  522. read_data, NULL, NULL);
  523. v->pb.seekable = 0;
  524. ret = av_probe_input_buffer(&v->pb, &in_fmt, v->segments[0]->url,
  525. NULL, 0, 0);
  526. if (ret < 0) {
  527. /* Free the ctx - it isn't initialized properly at this point,
  528. * so avformat_close_input shouldn't be called. If
  529. * avformat_open_input fails below, it frees and zeros the
  530. * context, so it doesn't need any special treatment like this. */
  531. avformat_free_context(v->ctx);
  532. v->ctx = NULL;
  533. goto fail;
  534. }
  535. v->ctx->pb = &v->pb;
  536. v->stream_offset = stream_offset;
  537. ret = avformat_open_input(&v->ctx, v->segments[0]->url, in_fmt, NULL);
  538. if (ret < 0)
  539. goto fail;
  540. v->ctx->ctx_flags &= ~AVFMTCTX_NOHEADER;
  541. ret = avformat_find_stream_info(v->ctx, NULL);
  542. if (ret < 0)
  543. goto fail;
  544. snprintf(bitrate_str, sizeof(bitrate_str), "%d", v->bandwidth);
  545. program = av_new_program(s, i);
  546. if (!program)
  547. goto fail;
  548. av_dict_set(&program->metadata, "variant_bitrate", bitrate_str, 0);
  549. /* Create new AVStreams for each stream in this variant */
  550. for (j = 0; j < v->ctx->nb_streams; j++) {
  551. AVStream *st = avformat_new_stream(s, NULL);
  552. AVStream *ist = v->ctx->streams[j];
  553. if (!st) {
  554. ret = AVERROR(ENOMEM);
  555. goto fail;
  556. }
  557. ff_program_add_stream_index(s, i, stream_offset + j);
  558. st->id = i;
  559. avpriv_set_pts_info(st, ist->pts_wrap_bits, ist->time_base.num, ist->time_base.den);
  560. avcodec_copy_context(st->codec, v->ctx->streams[j]->codec);
  561. if (v->bandwidth)
  562. av_dict_set(&st->metadata, "variant_bitrate", bitrate_str,
  563. 0);
  564. }
  565. stream_offset += v->ctx->nb_streams;
  566. }
  567. c->first_packet = 1;
  568. c->first_timestamp = AV_NOPTS_VALUE;
  569. c->seek_timestamp = AV_NOPTS_VALUE;
  570. return 0;
  571. fail:
  572. free_variant_list(c);
  573. return ret;
  574. }
  575. static int recheck_discard_flags(AVFormatContext *s, int first)
  576. {
  577. HLSContext *c = s->priv_data;
  578. int i, changed = 0;
  579. /* Check if any new streams are needed */
  580. for (i = 0; i < c->n_variants; i++)
  581. c->variants[i]->cur_needed = 0;;
  582. for (i = 0; i < s->nb_streams; i++) {
  583. AVStream *st = s->streams[i];
  584. struct variant *var = c->variants[s->streams[i]->id];
  585. if (st->discard < AVDISCARD_ALL)
  586. var->cur_needed = 1;
  587. }
  588. for (i = 0; i < c->n_variants; i++) {
  589. struct variant *v = c->variants[i];
  590. if (v->cur_needed && !v->needed) {
  591. v->needed = 1;
  592. changed = 1;
  593. v->cur_seq_no = c->cur_seq_no;
  594. v->pb.eof_reached = 0;
  595. av_log(s, AV_LOG_INFO, "Now receiving variant %d\n", i);
  596. } else if (first && !v->cur_needed && v->needed) {
  597. if (v->input)
  598. ffurl_close(v->input);
  599. v->input = NULL;
  600. v->needed = 0;
  601. changed = 1;
  602. av_log(s, AV_LOG_INFO, "No longer receiving variant %d\n", i);
  603. }
  604. }
  605. return changed;
  606. }
  607. static int hls_read_packet(AVFormatContext *s, AVPacket *pkt)
  608. {
  609. HLSContext *c = s->priv_data;
  610. int ret, i, minvariant = -1;
  611. if (c->first_packet) {
  612. recheck_discard_flags(s, 1);
  613. c->first_packet = 0;
  614. }
  615. start:
  616. c->end_of_segment = 0;
  617. for (i = 0; i < c->n_variants; i++) {
  618. struct variant *var = c->variants[i];
  619. /* Make sure we've got one buffered packet from each open variant
  620. * stream */
  621. if (var->needed && !var->pkt.data) {
  622. while (1) {
  623. int64_t ts_diff;
  624. AVStream *st;
  625. ret = av_read_frame(var->ctx, &var->pkt);
  626. if (ret < 0) {
  627. if (!var->pb.eof_reached)
  628. return ret;
  629. reset_packet(&var->pkt);
  630. break;
  631. } else {
  632. if (c->first_timestamp == AV_NOPTS_VALUE &&
  633. var->pkt.dts != AV_NOPTS_VALUE)
  634. c->first_timestamp = av_rescale_q(var->pkt.dts,
  635. var->ctx->streams[var->pkt.stream_index]->time_base,
  636. AV_TIME_BASE_Q);
  637. }
  638. if (c->seek_timestamp == AV_NOPTS_VALUE)
  639. break;
  640. if (var->pkt.dts == AV_NOPTS_VALUE) {
  641. c->seek_timestamp = AV_NOPTS_VALUE;
  642. break;
  643. }
  644. st = var->ctx->streams[var->pkt.stream_index];
  645. ts_diff = av_rescale_rnd(var->pkt.dts, AV_TIME_BASE,
  646. st->time_base.den, AV_ROUND_DOWN) -
  647. c->seek_timestamp;
  648. if (ts_diff >= 0 && (c->seek_flags & AVSEEK_FLAG_ANY ||
  649. var->pkt.flags & AV_PKT_FLAG_KEY)) {
  650. c->seek_timestamp = AV_NOPTS_VALUE;
  651. break;
  652. }
  653. av_packet_unref(&var->pkt);
  654. reset_packet(&var->pkt);
  655. }
  656. }
  657. /* Check if this stream still is on an earlier segment number, or
  658. * has the packet with the lowest dts */
  659. if (var->pkt.data) {
  660. struct variant *minvar = minvariant < 0 ?
  661. NULL : c->variants[minvariant];
  662. if (minvariant < 0 || var->cur_seq_no < minvar->cur_seq_no) {
  663. minvariant = i;
  664. } else if (var->cur_seq_no == minvar->cur_seq_no) {
  665. int64_t dts = var->pkt.dts;
  666. int64_t mindts = minvar->pkt.dts;
  667. AVStream *st = var->ctx->streams[var->pkt.stream_index];
  668. AVStream *minst = minvar->ctx->streams[minvar->pkt.stream_index];
  669. if (dts == AV_NOPTS_VALUE) {
  670. minvariant = i;
  671. } else if (mindts != AV_NOPTS_VALUE) {
  672. if (st->start_time != AV_NOPTS_VALUE)
  673. dts -= st->start_time;
  674. if (minst->start_time != AV_NOPTS_VALUE)
  675. mindts -= minst->start_time;
  676. if (av_compare_ts(dts, st->time_base,
  677. mindts, minst->time_base) < 0)
  678. minvariant = i;
  679. }
  680. }
  681. }
  682. }
  683. if (c->end_of_segment) {
  684. if (recheck_discard_flags(s, 0))
  685. goto start;
  686. }
  687. /* If we got a packet, return it */
  688. if (minvariant >= 0) {
  689. *pkt = c->variants[minvariant]->pkt;
  690. pkt->stream_index += c->variants[minvariant]->stream_offset;
  691. reset_packet(&c->variants[minvariant]->pkt);
  692. return 0;
  693. }
  694. return AVERROR_EOF;
  695. }
  696. static int hls_close(AVFormatContext *s)
  697. {
  698. HLSContext *c = s->priv_data;
  699. free_variant_list(c);
  700. av_dict_free(&c->avio_opts);
  701. return 0;
  702. }
  703. static int hls_read_seek(AVFormatContext *s, int stream_index,
  704. int64_t timestamp, int flags)
  705. {
  706. HLSContext *c = s->priv_data;
  707. int i, j, ret;
  708. if ((flags & AVSEEK_FLAG_BYTE) || !c->variants[0]->finished)
  709. return AVERROR(ENOSYS);
  710. c->seek_flags = flags;
  711. c->seek_timestamp = stream_index < 0 ? timestamp :
  712. av_rescale_rnd(timestamp, AV_TIME_BASE,
  713. s->streams[stream_index]->time_base.den,
  714. flags & AVSEEK_FLAG_BACKWARD ?
  715. AV_ROUND_DOWN : AV_ROUND_UP);
  716. timestamp = av_rescale_rnd(timestamp, AV_TIME_BASE, stream_index >= 0 ?
  717. s->streams[stream_index]->time_base.den :
  718. AV_TIME_BASE, flags & AVSEEK_FLAG_BACKWARD ?
  719. AV_ROUND_DOWN : AV_ROUND_UP);
  720. if (s->duration < c->seek_timestamp) {
  721. c->seek_timestamp = AV_NOPTS_VALUE;
  722. return AVERROR(EIO);
  723. }
  724. ret = AVERROR(EIO);
  725. for (i = 0; i < c->n_variants; i++) {
  726. /* Reset reading */
  727. struct variant *var = c->variants[i];
  728. int64_t pos = c->first_timestamp == AV_NOPTS_VALUE ?
  729. 0 : c->first_timestamp;
  730. if (var->input) {
  731. ffurl_close(var->input);
  732. var->input = NULL;
  733. }
  734. av_packet_unref(&var->pkt);
  735. reset_packet(&var->pkt);
  736. var->pb.eof_reached = 0;
  737. /* Clear any buffered data */
  738. var->pb.buf_end = var->pb.buf_ptr = var->pb.buffer;
  739. /* Reset the pos, to let the mpegts demuxer know we've seeked. */
  740. var->pb.pos = 0;
  741. /* Locate the segment that contains the target timestamp */
  742. for (j = 0; j < var->n_segments; j++) {
  743. if (timestamp >= pos &&
  744. timestamp < pos + var->segments[j]->duration) {
  745. var->cur_seq_no = var->start_seq_no + j;
  746. ret = 0;
  747. break;
  748. }
  749. pos += var->segments[j]->duration;
  750. }
  751. if (ret)
  752. c->seek_timestamp = AV_NOPTS_VALUE;
  753. }
  754. return ret;
  755. }
  756. static int hls_probe(AVProbeData *p)
  757. {
  758. /* Require #EXTM3U at the start, and either one of the ones below
  759. * somewhere for a proper match. */
  760. if (strncmp(p->buf, "#EXTM3U", 7))
  761. return 0;
  762. if (strstr(p->buf, "#EXT-X-STREAM-INF:") ||
  763. strstr(p->buf, "#EXT-X-TARGETDURATION:") ||
  764. strstr(p->buf, "#EXT-X-MEDIA-SEQUENCE:"))
  765. return AVPROBE_SCORE_MAX;
  766. return 0;
  767. }
  768. AVInputFormat ff_hls_demuxer = {
  769. .name = "hls,applehttp",
  770. .long_name = NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming"),
  771. .priv_data_size = sizeof(HLSContext),
  772. .read_probe = hls_probe,
  773. .read_header = hls_read_header,
  774. .read_packet = hls_read_packet,
  775. .read_close = hls_close,
  776. .read_seek = hls_read_seek,
  777. };