From patchwork Tue Sep 13 02:45:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rodger Combs X-Patchwork-Id: 558 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.134 with SMTP id o128csp1926827vsd; Mon, 12 Sep 2016 19:45:36 -0700 (PDT) X-Received: by 10.28.135.129 with SMTP id j123mr2827872wmd.110.1473734736856; Mon, 12 Sep 2016 19:45:36 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id fo2si18509891wjb.71.2016.09.12.19.45.33; Mon, 12 Sep 2016 19:45:36 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id EE6D2689FBB; Tue, 13 Sep 2016 05:45:18 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-oi0-f67.google.com (mail-oi0-f67.google.com [209.85.218.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F2C9D689F9B for ; Tue, 13 Sep 2016 05:45:11 +0300 (EEST) Received: by mail-oi0-f67.google.com with SMTP id c129so6340987oih.1 for ; Mon, 12 Sep 2016 19:45:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id; bh=BPUR0Bf5LCyt6TmJeQixLE0Yt0BuMUgjJSg5t8/gwzU=; b=lh0qXkAJweoasIAEzBZRgBZ/hRtIKr08NA27WLswM7GtLqpo3M0vf4VpHmmhjHpD3R X5r97exO35VriNl5XTXG1y6aUyeVe46Q2faa6+RctFRJUY4VlwT47MSeMO7Z77jxDD7N SL9HJ0M4rVOtuvMmKhNM5S82R+MRDvjtYHvsOXNV7xM8KvW++2pmRa0w/fJtu5L6Htjy tADi7Y2+oAG4ZqNv1nK67qndvJeY9bJwEJLydg2hGOQ4cvN5zhWsEzSp5tD0kh0JCpAE jPmU98M5L0rRpeNoPmwIs/731WFAwimXXEdRa4wxoKxRJkCDa3s7zYup2uQIMef+NdT9 UxcQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id; bh=BPUR0Bf5LCyt6TmJeQixLE0Yt0BuMUgjJSg5t8/gwzU=; b=aAdZCTKBAAwBHryzyKiR4hnqLPSDaFn0nWwlVJ+RGjLK/uWVzxtjkgHjmZp57tVH3O PkYQd+0OLQDE30xfFRLD1xEACw8ePDyqGKJolF53KjBi6txPE19NXaCjrvuo1TQbnvrc VmFrL7QIdDRmVjj1UHScOBiZScpZKyHgjYAdISe6vZiB9SY1d2WJHHwG9TjzcliTUd5Q PBYxgx5xpmXOzNFGXWkvV0/tvP1ly7GzFzXUwwJcdBu/xscV5YEYoTGigE34pl8+2Nit skALRBB9U83Tj0lP4g+TaHua//PFuxMq5JEtGfoYLWvKwty/7JjEfcO9zW+v1Y5vK/9B bATg== X-Gm-Message-State: AE9vXwMbkTqIED+HPaD/GNTuX+nyqHQC2hNCwrjNPvilLY6VMf/nMKUIP080TJJZm90T8g== X-Received: by 10.202.182.134 with SMTP id g128mr3802230oif.148.1473734722501; Mon, 12 Sep 2016 19:45:22 -0700 (PDT) Received: from Rodgers-MacBook-Pro.local.net (c-73-209-137-129.hsd1.il.comcast.net. [73.209.137.129]) by smtp.gmail.com with ESMTPSA id t81sm2595127ioi.1.2016.09.12.19.45.21 for (version=TLS1 cipher=AES128-SHA bits=128/128); Mon, 12 Sep 2016 19:45:21 -0700 (PDT) From: Rodger Combs To: ffmpeg-devel@ffmpeg.org Date: Mon, 12 Sep 2016 21:45:14 -0500 Message-Id: <20160913024514.70435-1-rodger.combs@gmail.com> X-Mailer: git-send-email 2.10.0 Subject: [FFmpeg-devel] [PATCH] lavf/matroska: expose stream encoding as global side-data 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Some demuxers can't handle Matroska compression, so this lets API users check if a file uses it and determine whether those players will fail. Currently only exports the first encoding; the format technically supports multiple, but I can't find an example of this and lavf doesn't support it. --- doc/APIchanges | 4 ++++ libavcodec/avcodec.h | 43 ++++++++++++++++++++++++++++++++++++++++++- libavcodec/avpacket.c | 1 + libavcodec/version.h | 4 ++-- libavformat/matroskadec.c | 23 +++++++++++++++++------ 5 files changed, 66 insertions(+), 9 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index 7ac809c..144bfac 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,10 @@ libavutil: 2015-08-28 API changes, most recent first: +2016-09-12 - xxxxxxx - lavc 57.56.100 - avcodec.h + Add AVMatroskaEncoding and its constituent enums + (AVMatroskaEncodingType and AVMatroskaEncodingAlgorithm) + 2016-08-29 - 4493390 - lavfi 6.58.100 - avfilter.h Add AVFilterContext.nb_threads. diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 01f9b29..4cca01f 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1330,6 +1330,42 @@ typedef struct AVCPBProperties { uint64_t vbv_delay; } AVCPBProperties; +/** + * Basic type of encoding in a Matroska stream + */ +typedef enum AVMatroskaEncodingType { + AV_MATROSKA_ENCODING_COMPRESSION = 0, + AV_MATROSKA_ENCODING_ENCRYPTION = 1, +} AVMatroskaEncodingType; + +/** + * Encoding algorithm in a Matroska stream + */ +typedef enum AVMatroskaEncodingAlgorithm { + // Compression + AV_MATROSKA_ENCODING_ZLIB = 0, + AV_MATROSKA_ENCODING_BZLIB = 1, + AV_MATROSKA_ENCODING_LZO1X = 2, + AV_MATROSKA_ENCODING_HEADERSTRIPPING = 3, + // Encryption + AV_MATROSKA_ENCODING_SIGNING = 0, + AV_MATROSKA_ENCODING_DES = 1, + AV_MATROSKA_ENCODING_3DES = 2, + AV_MATROSKA_ENCODING_TWOFISH = 3, + AV_MATROSKA_ENCODING_BLOWFISH = 4, + AV_MATROSKA_ENCODING_AES = 5, +} AVMatroskaEncodingAlgorithm; + +/** + * This structure describes the Matroska encoding (compression or encryption) applied to + * a stream. It can be useful when determining whether or not other demuxers can handle + * a file, since some players don't support header compression. + */ +typedef struct AVMatroskaEncoding { + AVMatroskaEncodingType type; + AVMatroskaEncodingAlgorithm algorithm; +} AVMatroskaEncoding; + #if FF_API_QSCALE_TYPE #define FF_QSCALE_TYPE_MPEG1 0 #define FF_QSCALE_TYPE_MPEG2 1 @@ -1525,7 +1561,12 @@ enum AVPacketSideDataType { * should be associated with a video stream and containts data in the form * of the AVMasteringDisplayMetadata struct. */ - AV_PKT_DATA_MASTERING_DISPLAY_METADATA + AV_PKT_DATA_MASTERING_DISPLAY_METADATA, + + /** + * Corresponds to the AVMatroskaEncoding struct. + */ + AV_PKT_DATA_MATROSKA_ENCODING, }; #define AV_PKT_DATA_QUALITY_FACTOR AV_PKT_DATA_QUALITY_STATS //DEPRECATED diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c index fa2844d..220e305 100644 --- a/libavcodec/avpacket.c +++ b/libavcodec/avpacket.c @@ -367,6 +367,7 @@ const char *av_packet_side_data_name(enum AVPacketSideDataType type) case AV_PKT_DATA_METADATA_UPDATE: return "Metadata Update"; case AV_PKT_DATA_MPEGTS_STREAM_ID: return "MPEGTS Stream ID"; case AV_PKT_DATA_MASTERING_DISPLAY_METADATA: return "Mastering display metadata"; + case AV_PKT_DATA_MATROSKA_ENCODING: return "Matroska Encoding"; } return NULL; } diff --git a/libavcodec/version.h b/libavcodec/version.h index f5dd118..ecd48c5 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -28,8 +28,8 @@ #include "libavutil/version.h" #define LIBAVCODEC_VERSION_MAJOR 57 -#define LIBAVCODEC_VERSION_MINOR 55 -#define LIBAVCODEC_VERSION_MICRO 101 +#define LIBAVCODEC_VERSION_MINOR 56 +#define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 77b8a5d..9bae9c8 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -1919,6 +1919,10 @@ static int matroska_parse_tracks(AVFormatContext *s) if (!track->codec_id) continue; + st = track->stream = avformat_new_stream(s, NULL); + if (!st) + return AVERROR(ENOMEM); + if (track->audio.samplerate < 0 || track->audio.samplerate > INT_MAX || isnan(track->audio.samplerate)) { av_log(matroska->ctx, AV_LOG_WARNING, @@ -1944,7 +1948,16 @@ static int matroska_parse_tracks(AVFormatContext *s) av_log(matroska->ctx, AV_LOG_ERROR, "Multiple combined encodings not supported"); } else if (encodings_list->nb_elem == 1) { + AVMatroskaEncoding *side_data = (void*)av_stream_new_side_data(st, + AV_PKT_DATA_MATROSKA_ENCODING, + sizeof(AVMatroskaEncoding)); + if (!side_data) + return AVERROR(ENOMEM); + + side_data->type = encodings[0].type; + if (encodings[0].type) { + side_data->algorithm = encodings[0].encryption.algo; if (encodings[0].encryption.key_id.size > 0) { /* Save the encryption key id to be stored later as a metadata tag. */ @@ -1972,10 +1985,12 @@ static int matroska_parse_tracks(AVFormatContext *s) encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_LZO && #endif encodings[0].compression.algo != MATROSKA_TRACK_ENCODING_COMP_HEADERSTRIP) { + side_data->algorithm = encodings[0].compression.algo; encodings[0].scope = 0; av_log(matroska->ctx, AV_LOG_ERROR, "Unsupported encoding type"); } else if (track->codec_priv.size && encodings[0].scope & 2) { + side_data->algorithm = encodings[0].compression.algo; uint8_t *codec_priv = track->codec_priv.data; int ret = matroska_decode_buffer(&track->codec_priv.data, &track->codec_priv.size, @@ -1989,6 +2004,8 @@ static int matroska_parse_tracks(AVFormatContext *s) if (codec_priv != track->codec_priv.data) av_free(codec_priv); + } else { + side_data->algorithm = encodings[0].compression.algo; } } @@ -2000,12 +2017,6 @@ static int matroska_parse_tracks(AVFormatContext *s) } } - st = track->stream = avformat_new_stream(s, NULL); - if (!st) { - av_free(key_id_base64); - return AVERROR(ENOMEM); - } - if (key_id_base64) { /* export encryption key id as base64 metadata tag */ av_dict_set(&st->metadata, "enc_key_id", key_id_base64, 0);