From patchwork Fri Nov 16 16:42:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Evgeny X-Patchwork-Id: 11041 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 1E8A144D4E5 for ; Fri, 16 Nov 2018 18:43:00 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9D754689EBB; Fri, 16 Nov 2018 18:43:00 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from basic.maxnet.ru (mx.maxnet.ru [195.112.97.17]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CD509689CB3 for ; Fri, 16 Nov 2018 18:42:54 +0200 (EET) Received: from [192.168.1.222] (kea.obninsk.ru [195.112.98.178] (may be forged)) by basic.maxnet.ru (8.14.6/8.14.6) with ESMTP id wAGGgsgv023456 for ; Fri, 16 Nov 2018 19:42:55 +0300 (MSK) (envelope-from kea@obninsk.ru) To: ffmpeg-devel@ffmpeg.org From: =?UTF-8?B?0JXQstCz0LXQvdC40Lk=?= Message-ID: <73a7506c-a985-0082-6920-43afcd92c029@obninsk.ru> Date: Fri, 16 Nov 2018 19:42:54 +0300 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.2.1 MIME-Version: 1.0 Content-Language: en-US Subject: [FFmpeg-devel] crypto support X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From 805886e76fe7123cd633ab564c7fc8cf932aba3a Mon Sep 17 00:00:00 2001 From: Evgeny Date: Fri, 16 Nov 2018 12:39:32 +0300 Subject: [PATCH 4/6] Application should have read PSSH data for license request Example: for (int i=0; i < ctx->nb_streams; i++) { AVStream* avs = ctx->streams[i]; if (avs->nb_side_data) { AVPacketSideData* sd = avs->side_data; if (sd->type == AV_PKT_DATA_ENCRYPTION_INIT_INFO) { licenseRequest(sd->data, sd->size); break; } } TODO: out of band PSSH (from manifest) --- libavformat/dashdec.c | 19 +++++++++++++++++++ libavformat/hls.c | 25 ++++++++++++++++++++++--- 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c index 497e7e4..9a984aa 100644 --- a/libavformat/dashdec.c +++ b/libavformat/dashdec.c @@ -1906,6 +1906,25 @@ static int open_demux_for_component(AVFormatContext *s, struct representation *p st->id = i; avcodec_parameters_copy(st->codecpar, pls->ctx->streams[i]->codecpar); avpriv_set_pts_info(st, ist->pts_wrap_bits, ist->time_base.num, ist->time_base.den); + + /* Copy side data if present */ + if (ist->nb_side_data) { + st->side_data = av_mallocz_array(ist->nb_side_data, + sizeof(AVPacketSideData)); + if (!st->side_data) + return AVERROR(ENOMEM); + st->nb_side_data = ist->nb_side_data; + + for (int i = 0; i < ist->nb_side_data; i++) { + uint8_t *data = av_memdup(ist->side_data[i].data, + ist->side_data[i].size); + if (!data) + return AVERROR(ENOMEM); + st->side_data[i].type = ist->side_data[i].type; + st->side_data[i].size = ist->side_data[i].size; + st->side_data[i].data = data; + } + } } return 0; diff --git a/libavformat/hls.c b/libavformat/hls.c index 8ad08ba..fc08a69 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -1229,9 +1229,9 @@ static int open_input(HLSContext *c, struct playlist *pls, struct segment *seg, } ret = 0; } else if (seg->key_type == KEY_SAMPLE_AES) { - av_log(pls->parent, AV_LOG_ERROR, - "SAMPLE-AES encryption is not supported yet\n"); - ret = AVERROR_PATCHWELCOME; + av_strlcpy(pls->key_url, seg->key, sizeof(pls->key_url)); + av_dict_set(&opts, "pssh", pls->key_url, 0); + ret = open_url(pls->parent, in, seg->url, c->avio_opts, opts, &is_http); } else ret = AVERROR(ENOSYS); @@ -1737,6 +1737,25 @@ static int update_streams_from_subdemuxer(AVFormatContext *s, struct playlist *p err = set_stream_info_from_input_stream(st, pls, ist); if (err < 0) return err; + + /* Copy side data if present */ + if (ist->nb_side_data) { + st->side_data = av_mallocz_array(ist->nb_side_data, + sizeof(AVPacketSideData)); + if (!st->side_data) + return AVERROR(ENOMEM); + st->nb_side_data = ist->nb_side_data; + + for (int i = 0; i < ist->nb_side_data; i++) { + uint8_t *data = av_memdup(ist->side_data[i].data, + ist->side_data[i].size); + if (!data) + return AVERROR(ENOMEM); + st->side_data[i].type = ist->side_data[i].type; + st->side_data[i].size = ist->side_data[i].size; + st->side_data[i].data = data; + } + } } return 0; -- 2.1.4