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.

673 lines
21KB

  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/opt.h"
  29. #include "avformat.h"
  30. #include "internal.h"
  31. #include <unistd.h>
  32. #include "avio_internal.h"
  33. #include "url.h"
  34. #define INITIAL_BUFFER_SIZE 32768
  35. /*
  36. * An apple http stream consists of a playlist with media segment files,
  37. * played sequentially. There may be several playlists with the same
  38. * video content, in different bandwidth variants, that are played in
  39. * parallel (preferrably only one bandwidth variant at a time). In this case,
  40. * the user supplied the url to a main playlist that only lists the variant
  41. * playlists.
  42. *
  43. * If the main playlist doesn't point at any variants, we still create
  44. * one anonymous toplevel variant for this, to maintain the structure.
  45. */
  46. enum KeyType {
  47. KEY_NONE,
  48. KEY_AES_128,
  49. };
  50. struct segment {
  51. int duration;
  52. char url[MAX_URL_SIZE];
  53. char key[MAX_URL_SIZE];
  54. enum KeyType key_type;
  55. uint8_t iv[16];
  56. };
  57. /*
  58. * Each variant has its own demuxer. If it currently is active,
  59. * it has an open AVIOContext too, and potentially an AVPacket
  60. * containing the next packet from this stream.
  61. */
  62. struct variant {
  63. int bandwidth;
  64. char url[MAX_URL_SIZE];
  65. AVIOContext pb;
  66. uint8_t* read_buffer;
  67. URLContext *input;
  68. AVFormatContext *parent;
  69. int index;
  70. AVFormatContext *ctx;
  71. AVPacket pkt;
  72. int stream_offset;
  73. int finished;
  74. int target_duration;
  75. int start_seq_no;
  76. int n_segments;
  77. struct segment **segments;
  78. int needed, cur_needed;
  79. int cur_seq_no;
  80. int64_t last_load_time;
  81. char key_url[MAX_URL_SIZE];
  82. uint8_t key[16];
  83. };
  84. typedef struct AppleHTTPContext {
  85. int n_variants;
  86. struct variant **variants;
  87. int cur_seq_no;
  88. int end_of_segment;
  89. int first_packet;
  90. } AppleHTTPContext;
  91. static int read_chomp_line(AVIOContext *s, char *buf, int maxlen)
  92. {
  93. int len = ff_get_line(s, buf, maxlen);
  94. while (len > 0 && isspace(buf[len - 1]))
  95. buf[--len] = '\0';
  96. return len;
  97. }
  98. static void free_segment_list(struct variant *var)
  99. {
  100. int i;
  101. for (i = 0; i < var->n_segments; i++)
  102. av_free(var->segments[i]);
  103. av_freep(&var->segments);
  104. var->n_segments = 0;
  105. }
  106. static void free_variant_list(AppleHTTPContext *c)
  107. {
  108. int i;
  109. for (i = 0; i < c->n_variants; i++) {
  110. struct variant *var = c->variants[i];
  111. free_segment_list(var);
  112. av_free_packet(&var->pkt);
  113. av_free(var->pb.buffer);
  114. if (var->input)
  115. ffurl_close(var->input);
  116. if (var->ctx) {
  117. var->ctx->pb = NULL;
  118. av_close_input_file(var->ctx);
  119. }
  120. av_free(var);
  121. }
  122. av_freep(&c->variants);
  123. c->n_variants = 0;
  124. }
  125. /*
  126. * Used to reset a statically allocated AVPacket to a clean slate,
  127. * containing no data.
  128. */
  129. static void reset_packet(AVPacket *pkt)
  130. {
  131. av_init_packet(pkt);
  132. pkt->data = NULL;
  133. }
  134. static struct variant *new_variant(AppleHTTPContext *c, int bandwidth,
  135. const char *url, const char *base)
  136. {
  137. struct variant *var = av_mallocz(sizeof(struct variant));
  138. if (!var)
  139. return NULL;
  140. reset_packet(&var->pkt);
  141. var->bandwidth = bandwidth;
  142. ff_make_absolute_url(var->url, sizeof(var->url), base, url);
  143. dynarray_add(&c->variants, &c->n_variants, var);
  144. return var;
  145. }
  146. struct variant_info {
  147. char bandwidth[20];
  148. };
  149. static void handle_variant_args(struct variant_info *info, const char *key,
  150. int key_len, char **dest, int *dest_len)
  151. {
  152. if (!strncmp(key, "BANDWIDTH=", key_len)) {
  153. *dest = info->bandwidth;
  154. *dest_len = sizeof(info->bandwidth);
  155. }
  156. }
  157. struct key_info {
  158. char uri[MAX_URL_SIZE];
  159. char method[10];
  160. char iv[35];
  161. };
  162. static void handle_key_args(struct key_info *info, const char *key,
  163. int key_len, char **dest, int *dest_len)
  164. {
  165. if (!strncmp(key, "METHOD=", key_len)) {
  166. *dest = info->method;
  167. *dest_len = sizeof(info->method);
  168. } else if (!strncmp(key, "URI=", key_len)) {
  169. *dest = info->uri;
  170. *dest_len = sizeof(info->uri);
  171. } else if (!strncmp(key, "IV=", key_len)) {
  172. *dest = info->iv;
  173. *dest_len = sizeof(info->iv);
  174. }
  175. }
  176. static int parse_playlist(AppleHTTPContext *c, const char *url,
  177. struct variant *var, AVIOContext *in)
  178. {
  179. int ret = 0, duration = 0, is_segment = 0, is_variant = 0, bandwidth = 0;
  180. enum KeyType key_type = KEY_NONE;
  181. uint8_t iv[16] = "";
  182. int has_iv = 0;
  183. char key[MAX_URL_SIZE];
  184. char line[1024];
  185. const char *ptr;
  186. int close_in = 0;
  187. if (!in) {
  188. close_in = 1;
  189. if ((ret = avio_open(&in, url, AVIO_FLAG_READ)) < 0)
  190. return ret;
  191. }
  192. read_chomp_line(in, line, sizeof(line));
  193. if (strcmp(line, "#EXTM3U")) {
  194. ret = AVERROR_INVALIDDATA;
  195. goto fail;
  196. }
  197. if (var) {
  198. free_segment_list(var);
  199. var->finished = 0;
  200. }
  201. while (!in->eof_reached) {
  202. read_chomp_line(in, line, sizeof(line));
  203. if (av_strstart(line, "#EXT-X-STREAM-INF:", &ptr)) {
  204. struct variant_info info = {{0}};
  205. is_variant = 1;
  206. ff_parse_key_value(ptr, (ff_parse_key_val_cb) handle_variant_args,
  207. &info);
  208. bandwidth = atoi(info.bandwidth);
  209. } else if (av_strstart(line, "#EXT-X-KEY:", &ptr)) {
  210. struct key_info info = {{0}};
  211. ff_parse_key_value(ptr, (ff_parse_key_val_cb) handle_key_args,
  212. &info);
  213. key_type = KEY_NONE;
  214. has_iv = 0;
  215. if (!strcmp(info.method, "AES-128"))
  216. key_type = KEY_AES_128;
  217. if (!strncmp(info.iv, "0x", 2) || !strncmp(info.iv, "0X", 2)) {
  218. ff_hex_to_data(iv, info.iv + 2);
  219. has_iv = 1;
  220. }
  221. av_strlcpy(key, info.uri, sizeof(key));
  222. } else if (av_strstart(line, "#EXT-X-TARGETDURATION:", &ptr)) {
  223. if (!var) {
  224. var = new_variant(c, 0, url, NULL);
  225. if (!var) {
  226. ret = AVERROR(ENOMEM);
  227. goto fail;
  228. }
  229. }
  230. var->target_duration = atoi(ptr);
  231. } else if (av_strstart(line, "#EXT-X-MEDIA-SEQUENCE:", &ptr)) {
  232. if (!var) {
  233. var = new_variant(c, 0, url, NULL);
  234. if (!var) {
  235. ret = AVERROR(ENOMEM);
  236. goto fail;
  237. }
  238. }
  239. var->start_seq_no = atoi(ptr);
  240. } else if (av_strstart(line, "#EXT-X-ENDLIST", &ptr)) {
  241. if (var)
  242. var->finished = 1;
  243. } else if (av_strstart(line, "#EXTINF:", &ptr)) {
  244. is_segment = 1;
  245. duration = atoi(ptr);
  246. } else if (av_strstart(line, "#", NULL)) {
  247. continue;
  248. } else if (line[0]) {
  249. if (is_variant) {
  250. if (!new_variant(c, bandwidth, line, url)) {
  251. ret = AVERROR(ENOMEM);
  252. goto fail;
  253. }
  254. is_variant = 0;
  255. bandwidth = 0;
  256. }
  257. if (is_segment) {
  258. struct segment *seg;
  259. if (!var) {
  260. var = new_variant(c, 0, url, NULL);
  261. if (!var) {
  262. ret = AVERROR(ENOMEM);
  263. goto fail;
  264. }
  265. }
  266. seg = av_malloc(sizeof(struct segment));
  267. if (!seg) {
  268. ret = AVERROR(ENOMEM);
  269. goto fail;
  270. }
  271. seg->duration = duration;
  272. seg->key_type = key_type;
  273. if (has_iv) {
  274. memcpy(seg->iv, iv, sizeof(iv));
  275. } else {
  276. int seq = var->start_seq_no + var->n_segments;
  277. memset(seg->iv, 0, sizeof(seg->iv));
  278. AV_WB32(seg->iv + 12, seq);
  279. }
  280. ff_make_absolute_url(seg->key, sizeof(seg->key), url, key);
  281. ff_make_absolute_url(seg->url, sizeof(seg->url), url, line);
  282. dynarray_add(&var->segments, &var->n_segments, seg);
  283. is_segment = 0;
  284. }
  285. }
  286. }
  287. if (var)
  288. var->last_load_time = av_gettime();
  289. fail:
  290. if (close_in)
  291. avio_close(in);
  292. return ret;
  293. }
  294. static int open_input(struct variant *var)
  295. {
  296. struct segment *seg = var->segments[var->cur_seq_no - var->start_seq_no];
  297. if (seg->key_type == KEY_NONE) {
  298. return ffurl_open(&var->input, seg->url, AVIO_FLAG_READ);
  299. } else if (seg->key_type == KEY_AES_128) {
  300. char iv[33], key[33], url[MAX_URL_SIZE];
  301. int ret;
  302. if (strcmp(seg->key, var->key_url)) {
  303. URLContext *uc;
  304. if (ffurl_open(&uc, seg->key, AVIO_FLAG_READ) == 0) {
  305. if (ffurl_read_complete(uc, var->key, sizeof(var->key))
  306. != sizeof(var->key)) {
  307. av_log(NULL, AV_LOG_ERROR, "Unable to read key file %s\n",
  308. seg->key);
  309. }
  310. ffurl_close(uc);
  311. } else {
  312. av_log(NULL, AV_LOG_ERROR, "Unable to open key file %s\n",
  313. seg->key);
  314. }
  315. av_strlcpy(var->key_url, seg->key, sizeof(var->key_url));
  316. }
  317. ff_data_to_hex(iv, seg->iv, sizeof(seg->iv), 0);
  318. ff_data_to_hex(key, var->key, sizeof(var->key), 0);
  319. iv[32] = key[32] = '\0';
  320. if (strstr(seg->url, "://"))
  321. snprintf(url, sizeof(url), "crypto+%s", seg->url);
  322. else
  323. snprintf(url, sizeof(url), "crypto:%s", seg->url);
  324. if ((ret = ffurl_alloc(&var->input, url, AVIO_FLAG_READ)) < 0)
  325. return ret;
  326. av_set_string3(var->input->priv_data, "key", key, 0, NULL);
  327. av_set_string3(var->input->priv_data, "iv", iv, 0, NULL);
  328. if ((ret = ffurl_connect(var->input)) < 0) {
  329. ffurl_close(var->input);
  330. var->input = NULL;
  331. return ret;
  332. }
  333. return 0;
  334. }
  335. return AVERROR(ENOSYS);
  336. }
  337. static int read_data(void *opaque, uint8_t *buf, int buf_size)
  338. {
  339. struct variant *v = opaque;
  340. AppleHTTPContext *c = v->parent->priv_data;
  341. int ret, i;
  342. restart:
  343. if (!v->input) {
  344. reload:
  345. /* If this is a live stream and target_duration has elapsed since
  346. * the last playlist reload, reload the variant playlists now. */
  347. if (!v->finished &&
  348. av_gettime() - v->last_load_time >= v->target_duration*1000000 &&
  349. (ret = parse_playlist(c, v->url, v, NULL)) < 0)
  350. return ret;
  351. if (v->cur_seq_no < v->start_seq_no) {
  352. av_log(NULL, AV_LOG_WARNING,
  353. "skipping %d segments ahead, expired from playlists\n",
  354. v->start_seq_no - v->cur_seq_no);
  355. v->cur_seq_no = v->start_seq_no;
  356. }
  357. if (v->cur_seq_no >= v->start_seq_no + v->n_segments) {
  358. if (v->finished)
  359. return AVERROR_EOF;
  360. while (av_gettime() - v->last_load_time <
  361. v->target_duration*1000000) {
  362. if (url_interrupt_cb())
  363. return AVERROR_EXIT;
  364. usleep(100*1000);
  365. }
  366. /* Enough time has elapsed since the last reload */
  367. goto reload;
  368. }
  369. ret = open_input(v);
  370. if (ret < 0)
  371. return ret;
  372. }
  373. ret = ffurl_read(v->input, buf, buf_size);
  374. if (ret > 0)
  375. return ret;
  376. if (ret < 0 && ret != AVERROR_EOF)
  377. return ret;
  378. ffurl_close(v->input);
  379. v->input = NULL;
  380. v->cur_seq_no++;
  381. c->end_of_segment = 1;
  382. c->cur_seq_no = v->cur_seq_no;
  383. if (v->ctx) {
  384. v->needed = 0;
  385. for (i = v->stream_offset; i < v->stream_offset + v->ctx->nb_streams;
  386. i++) {
  387. if (v->parent->streams[i]->discard < AVDISCARD_ALL)
  388. v->needed = 1;
  389. }
  390. }
  391. if (!v->needed) {
  392. av_log(v->parent, AV_LOG_INFO, "No longer receiving variant %d\n",
  393. v->index);
  394. return AVERROR_EOF;
  395. }
  396. goto restart;
  397. }
  398. static int applehttp_read_header(AVFormatContext *s, AVFormatParameters *ap)
  399. {
  400. AppleHTTPContext *c = s->priv_data;
  401. int ret = 0, i, j, stream_offset = 0;
  402. if ((ret = parse_playlist(c, s->filename, NULL, s->pb)) < 0)
  403. goto fail;
  404. if (c->n_variants == 0) {
  405. av_log(NULL, AV_LOG_WARNING, "Empty playlist\n");
  406. ret = AVERROR_EOF;
  407. goto fail;
  408. }
  409. /* If the playlist only contained variants, parse each individual
  410. * variant playlist. */
  411. if (c->n_variants > 1 || c->variants[0]->n_segments == 0) {
  412. for (i = 0; i < c->n_variants; i++) {
  413. struct variant *v = c->variants[i];
  414. if ((ret = parse_playlist(c, v->url, v, NULL)) < 0)
  415. goto fail;
  416. }
  417. }
  418. if (c->variants[0]->n_segments == 0) {
  419. av_log(NULL, AV_LOG_WARNING, "Empty playlist\n");
  420. ret = AVERROR_EOF;
  421. goto fail;
  422. }
  423. /* If this isn't a live stream, calculate the total duration of the
  424. * stream. */
  425. if (c->variants[0]->finished) {
  426. int64_t duration = 0;
  427. for (i = 0; i < c->variants[0]->n_segments; i++)
  428. duration += c->variants[0]->segments[i]->duration;
  429. s->duration = duration * AV_TIME_BASE;
  430. }
  431. /* Open the demuxer for each variant */
  432. for (i = 0; i < c->n_variants; i++) {
  433. struct variant *v = c->variants[i];
  434. AVInputFormat *in_fmt = NULL;
  435. char bitrate_str[20];
  436. if (v->n_segments == 0)
  437. continue;
  438. v->index = i;
  439. v->needed = 1;
  440. v->parent = s;
  441. /* If this is a live stream with more than 3 segments, start at the
  442. * third last segment. */
  443. v->cur_seq_no = v->start_seq_no;
  444. if (!v->finished && v->n_segments > 3)
  445. v->cur_seq_no = v->start_seq_no + v->n_segments - 3;
  446. v->read_buffer = av_malloc(INITIAL_BUFFER_SIZE);
  447. ffio_init_context(&v->pb, v->read_buffer, INITIAL_BUFFER_SIZE, 0, v,
  448. read_data, NULL, NULL);
  449. v->pb.seekable = 0;
  450. ret = av_probe_input_buffer(&v->pb, &in_fmt, v->segments[0]->url,
  451. NULL, 0, 0);
  452. if (ret < 0)
  453. goto fail;
  454. ret = av_open_input_stream(&v->ctx, &v->pb, v->segments[0]->url,
  455. in_fmt, NULL);
  456. if (ret < 0)
  457. goto fail;
  458. v->stream_offset = stream_offset;
  459. snprintf(bitrate_str, sizeof(bitrate_str), "%d", v->bandwidth);
  460. /* Create new AVStreams for each stream in this variant */
  461. for (j = 0; j < v->ctx->nb_streams; j++) {
  462. AVStream *st = av_new_stream(s, i);
  463. if (!st) {
  464. ret = AVERROR(ENOMEM);
  465. goto fail;
  466. }
  467. avcodec_copy_context(st->codec, v->ctx->streams[j]->codec);
  468. if (v->bandwidth)
  469. av_metadata_set2(&st->metadata, "variant_bitrate", bitrate_str,
  470. 0);
  471. }
  472. stream_offset += v->ctx->nb_streams;
  473. }
  474. c->first_packet = 1;
  475. return 0;
  476. fail:
  477. free_variant_list(c);
  478. return ret;
  479. }
  480. static int recheck_discard_flags(AVFormatContext *s, int first)
  481. {
  482. AppleHTTPContext *c = s->priv_data;
  483. int i, changed = 0;
  484. /* Check if any new streams are needed */
  485. for (i = 0; i < c->n_variants; i++)
  486. c->variants[i]->cur_needed = 0;;
  487. for (i = 0; i < s->nb_streams; i++) {
  488. AVStream *st = s->streams[i];
  489. struct variant *var = c->variants[s->streams[i]->id];
  490. if (st->discard < AVDISCARD_ALL)
  491. var->cur_needed = 1;
  492. }
  493. for (i = 0; i < c->n_variants; i++) {
  494. struct variant *v = c->variants[i];
  495. if (v->cur_needed && !v->needed) {
  496. v->needed = 1;
  497. changed = 1;
  498. v->cur_seq_no = c->cur_seq_no;
  499. v->pb.eof_reached = 0;
  500. av_log(s, AV_LOG_INFO, "Now receiving variant %d\n", i);
  501. } else if (first && !v->cur_needed && v->needed) {
  502. if (v->input)
  503. ffurl_close(v->input);
  504. v->input = NULL;
  505. v->needed = 0;
  506. changed = 1;
  507. av_log(s, AV_LOG_INFO, "No longer receiving variant %d\n", i);
  508. }
  509. }
  510. return changed;
  511. }
  512. static int applehttp_read_packet(AVFormatContext *s, AVPacket *pkt)
  513. {
  514. AppleHTTPContext *c = s->priv_data;
  515. int ret, i, minvariant = -1;
  516. if (c->first_packet) {
  517. recheck_discard_flags(s, 1);
  518. c->first_packet = 0;
  519. }
  520. start:
  521. c->end_of_segment = 0;
  522. for (i = 0; i < c->n_variants; i++) {
  523. struct variant *var = c->variants[i];
  524. /* Make sure we've got one buffered packet from each open variant
  525. * stream */
  526. if (var->needed && !var->pkt.data) {
  527. ret = av_read_frame(var->ctx, &var->pkt);
  528. if (ret < 0) {
  529. if (!var->pb.eof_reached)
  530. return ret;
  531. reset_packet(&var->pkt);
  532. }
  533. }
  534. /* Check if this stream has the packet with the lowest dts */
  535. if (var->pkt.data) {
  536. if (minvariant < 0 ||
  537. var->pkt.dts < c->variants[minvariant]->pkt.dts)
  538. minvariant = i;
  539. }
  540. }
  541. if (c->end_of_segment) {
  542. if (recheck_discard_flags(s, 0))
  543. goto start;
  544. }
  545. /* If we got a packet, return it */
  546. if (minvariant >= 0) {
  547. *pkt = c->variants[minvariant]->pkt;
  548. pkt->stream_index += c->variants[minvariant]->stream_offset;
  549. reset_packet(&c->variants[minvariant]->pkt);
  550. return 0;
  551. }
  552. return AVERROR_EOF;
  553. }
  554. static int applehttp_close(AVFormatContext *s)
  555. {
  556. AppleHTTPContext *c = s->priv_data;
  557. free_variant_list(c);
  558. return 0;
  559. }
  560. static int applehttp_read_seek(AVFormatContext *s, int stream_index,
  561. int64_t timestamp, int flags)
  562. {
  563. AppleHTTPContext *c = s->priv_data;
  564. int i, j, ret;
  565. if ((flags & AVSEEK_FLAG_BYTE) || !c->variants[0]->finished)
  566. return AVERROR(ENOSYS);
  567. timestamp = av_rescale_rnd(timestamp, 1, stream_index >= 0 ?
  568. s->streams[stream_index]->time_base.den :
  569. AV_TIME_BASE, flags & AVSEEK_FLAG_BACKWARD ?
  570. AV_ROUND_DOWN : AV_ROUND_UP);
  571. ret = AVERROR(EIO);
  572. for (i = 0; i < c->n_variants; i++) {
  573. /* Reset reading */
  574. struct variant *var = c->variants[i];
  575. int64_t pos = 0;
  576. if (var->input) {
  577. ffurl_close(var->input);
  578. var->input = NULL;
  579. }
  580. av_free_packet(&var->pkt);
  581. reset_packet(&var->pkt);
  582. var->pb.eof_reached = 0;
  583. /* Locate the segment that contains the target timestamp */
  584. for (j = 0; j < var->n_segments; j++) {
  585. if (timestamp >= pos &&
  586. timestamp < pos + var->segments[j]->duration) {
  587. var->cur_seq_no = var->start_seq_no + j;
  588. ret = 0;
  589. break;
  590. }
  591. pos += var->segments[j]->duration;
  592. }
  593. }
  594. return ret;
  595. }
  596. static int applehttp_probe(AVProbeData *p)
  597. {
  598. /* Require #EXTM3U at the start, and either one of the ones below
  599. * somewhere for a proper match. */
  600. if (strncmp(p->buf, "#EXTM3U", 7))
  601. return 0;
  602. if (strstr(p->buf, "#EXT-X-STREAM-INF:") ||
  603. strstr(p->buf, "#EXT-X-TARGETDURATION:") ||
  604. strstr(p->buf, "#EXT-X-MEDIA-SEQUENCE:"))
  605. return AVPROBE_SCORE_MAX;
  606. return 0;
  607. }
  608. AVInputFormat ff_applehttp_demuxer = {
  609. "applehttp",
  610. NULL_IF_CONFIG_SMALL("Apple HTTP Live Streaming format"),
  611. sizeof(AppleHTTPContext),
  612. applehttp_probe,
  613. applehttp_read_header,
  614. applehttp_read_packet,
  615. applehttp_close,
  616. applehttp_read_seek,
  617. };