From patchwork Mon Sep 4 11:27:54 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 43520 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:4f16:b0:149:dfde:5c0a with SMTP id gi22csp1137781pzb; Mon, 4 Sep 2023 04:30:18 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFAcZE20ED10CrGMftFJ3IYUs4xM730MnZJlG0gDV/Gf7VnwOE5AG7i4S3+cWbHEboaoeih X-Received: by 2002:aa7:d481:0:b0:51b:c714:a2a1 with SMTP id b1-20020aa7d481000000b0051bc714a2a1mr7874574edr.7.1693827018338; Mon, 04 Sep 2023 04:30:18 -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 d22-20020a05640208d600b005233fb096d2si6152829edz.460.2023.09.04.04.30.17; Mon, 04 Sep 2023 04:30:18 -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=@outlook.com header.s=selector1 header.b=Sh9PJxfF; arc=fail (body hash mismatch); 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 sp=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CA06068C7E7; Mon, 4 Sep 2023 14:30:14 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-he1eur04olkn2033.outbound.protection.outlook.com [40.92.73.33]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1192368C7DA for ; Mon, 4 Sep 2023 14:30:13 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=S+2Jq0QziSeFLXovGWPYM2UiuDsTPSP4peOx82klN7C04KLiHHQBCim9smp/Arr1O0ql8BrEC68C7WopkMxv7cLIF55th3vPrMKTSgar3PDjrdsPM2F0v+8qCwnJnTgHFHhYBkaDkyxKe99GsHE8Op0dA2R3XH2KwiUzsL4c3qghQ2tC2wQmpMQIKb5IEb63TUXaXeUPyiVZb5GQm18tcB9wxQTQFjuuO/nv+sXR7jS/WnKltcs3JdQjC+LUxp5dnRo/oacy+++O6IjVGFAuGpJCf74w5QDFSWERMweakidl0BVBELDDCaoY7hYzaVmZQEhN5OUqomhHXwYpLMrRZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=IJeOq4bYOv88Yff7mdGRZhWWkQJ9mKO+mD3HCpmM0n4=; b=gBHwJD7rUiaicHphJe7Pi+vvhdh3EPuRY5E8/3Hvo44uG5gdLEPrlyT0rr6NR3JnriBtde67/Ln1VJf7kVc42JvhEHM21VMmsfRUv5rYuXPVQM6VdRTlXg3BB3AVuBZNggBSDXomdkRWuNGcWo4cDnBeYx7s28yTzYHdAeQUUsogFVQB0HrgWhG4rSq5FQ6SEzrnFD3u0UE2zmqIAQkMRB1LTlyi8M6/bu/75my/BVC4VfcC9ZOslDqZY/ZlcAceHJlI6LnEi+DVQ9C6JoQ4tgW1F47eU3yrOhmyM0auCzbXprZNQ7sJWOpHzaf1+z7TLdWXprDddPPc/j3tMPQx9A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=IJeOq4bYOv88Yff7mdGRZhWWkQJ9mKO+mD3HCpmM0n4=; b=Sh9PJxfFMaTaxSQ58Y9kgRdx2jog3vhkeakmqt4EGyRpnGozTc87AYK13TnMKnMjrZZ/RTGvTCino0mmjgfgLr8xGepwUE9ZlC0enuvqoq/h8MrWs0xsI4DcNaqW9raPi/peq183dOZfEd4zdQT0/cEk7CpR578VLrDcfJi2deW9gHEOs7B3uoE5bIBmf5yky+cfBGSGS5QL4fYQARRrrX4+8239pvpEVEdBpG7AIEDLdqqn8mNbbo5tRj3spurjXtFIBjbj/ZcxwthIUeucVB6ws4T0/5soJpK6dMtrNPHJ29TWagb0FbgTFYz79lfWN8g0tuMSf19phCtJCzCTuQ== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by AM8P250MB0280.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:32b::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6745.32; Mon, 4 Sep 2023 11:30:11 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa%3]) with mapi id 15.20.6745.030; Mon, 4 Sep 2023 11:30:11 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 4 Sep 2023 13:27:54 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [BsIijhcLHNcG75IkpLU1WCNjtjc+POvBBCbcHsvR2fQ=] X-ClientProxiedBy: ZR2P278CA0078.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:65::13) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <20230904112759.2652347-14-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|AM8P250MB0280:EE_ X-MS-Office365-Filtering-Correlation-Id: af7b2152-1ec7-454d-d148-08dbad3a4cfc X-MS-Exchange-SLBlob-MailProps: 0wLWl8rLpvtlEyItUpZmgfjbRm+zWpoMdHZqGqzBQ6YHIJwX1oItnlcM04RBeiF8onaB4CFLH1f+kFqYRCkQHDhev9lwsRCHzWAMGgtUPj/TMnCgor+h7BAWl9NZJeGoHqJNOgk+YIm43c1Ezmz8PaZQTb3Duio0jSTVnw3qXrcsGMUpr1cSAAH9XkIMrLBshI1x85UKeos0iIwPnOvzQ9ita+HrbXQNp4KiJH7NoBBnT2p33yB0nicu2Xqh27Z2tOfdY4xcurwrkElPX4eW81H9SqrNuNGVd3caMcSxibNZUpRXtSYLbeUQWqCnmYjq2WPcvhVJaEu8bhNzmt1CRCGNyuQwzEyla1t5N7XMDWxFxRceGdKN3sSO+B0Zn7n3Cs7gM86yL/xLsxLeOXB1+Jttv23/DJ4OAfstUIiiFyapAGfZxZn9OCQE7v7vZWFBHGlZ4nSKyoxROBQUiiTxUQh4MskstDIkHvuLrYhulPsFKvxvI7pv6anSGTjZJH6+AALWvJ+iDYcMwBNkSgPmk0zsR6Ehg6gfvOxkmFsmydvWifzy5U+Nt2CJSubTgfuX15+sd7nU5sZHjvHx24pN6/pA11KkpfJOd5E5QaNtY/yg2s5y0bmlzFXsdXRDiZMb07lQ9fdG0zyAAtbdCZAAlvxUrSVpeU8OKg9PnGsNH/vOAh0wcVEgHJ5eBsEc3x2wAm87ktS/wQEq5y07yCLBE894QN+9P+zTxnUgNZWqIiWKZJIf2btAMMDLHYtGXFmFlapTTIVPLsU= X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: qpVBQFVsG/zMonbY4mnPpIOIE5xPUKDTIgd1mlcXEXU8Fndw1dJQXDrI7E40Rm2S++Pp1H6O6g5hcMTOllW135XiAzTUbQE8LJ8gYrCK0QgaHHBPunpG0pEIPJvYLMJr1StJ/Rr1Vmy2pPZ7a1bMYHm8BhzZj8YtMFv4FiD09AQQuv2Glo2JlFvm3M+2bW0FOfn9im+4M2gDlb++oOUV5UMOpE6sOt9eRmgXhFMuOs954Gy7tZ5AH7jpCcxsLxpEMdBPycCwIQ0142cxRDZowmXrwadClCeINGMIInc42nvwPykAv2s9SraIBRlSVY9R8tBfL9YtZdwE3I9y9pXyUXS2yHkIaScaj3Pbla3LBE4QC6ls3sABA+Lt6pEEPCBhZuoL+O+rr0njkBUpz4wPt/zAPkBZOX8BV1/PyOZpkKkhhQUGv01GNJl1iPMaWskzrwNWHaLVo1x/8H9G7NlfefCCkJe6lylIysO5o2bNMumeX7hxrqoDkEO7ne9SKGgQOP4rFt9GCopLyqnhIx18q5HZX4quMqudjozmhVUQXpPyedPaPGtCqT8vOnCrYgaCHXHrx0qYBgiRt5MxC8/kw9zzZQeJ6lZdPGTZ1HdtD6QkRKtmRpAC4iUSVbp4501Q X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 6TmIW1Jc5AffGTkXch4Md0sD31o82VdLnvMGVKb4vnsAymvrAjlzqmMFUwTDqkS3TCRlpZj5UadEUzLTDy2ZLFRR93aUAUni0V9tkntWIg6y6b8RknI8BGzE3e8ns0/pce0DEMhLYun4zpVVYNVaUyBSupdF2rk6EPMI1CuYCWtOMjs4vyiKM8kAQVg0xW51wCTjGYRPej7cK+IqGMxfEhm16mqjDLyUwK2gliAmG3UCDzaKv25aTr0IcBkzpFD5r2sVS3fPB5KSuU2ynzLIa5GKEJhgsDg3j2RKbfdKrzl+JiZewd+6qQ3d0ykFJZh6KE0yL5iT0Sh/Bgqrr3FWdJdO6p9UzVA2DZcq4WFJVAQR48J0VZhuMAfWBeqR+2Ug5Iyl6CiDz7gFkqM2cn29BCI3EV32/fT8yvUVV/+9NNIxZsf1TopAu6N8ADBSh7ShupUyTjL6b6R3sspKR6q+mir5k5CMxG9c5vXwyugV8EY5SU7O7/5yRw4ywHydkNgJUhRcyh9afY+jQq2mqVXkyH2xmnRp0+Tu/x1dEkCDoHaX1oYFc5k3t+Yg/N3qBZGZGIn3EwvXJvkpC+rVfHvE1aZjhX8gzkdawI+90aUSxSd4aXRnbc86qvhRLJSOiXzE2TBr7jtuJz5deJjlqcvDhsJe3F1uHphXJNQJpmPyysWF6F5xSXNbyTlP2Dt35xdlr/87r+s62YtTfNsKFEAplCTVfh9sC0oAJQW1O0G82gspviIVuW/QaOEgK8k6onHX/rncau1yzZZmG5EimW+eK0dtszja9idubURZ1QMyIiyoDxIAOB7ApZuPMJUXnp5wHwoTstADDSjtUTQu1V1mam2ZDdDxCc6gos8mfRU2zXqrzZYkRbOi3o1fVvZoE+TLwXWfxQRLSAXrIRv63m3vLWAcWatVdS8LpHJKcvjWRC5PSdSMA8p/0sSbf+D4wWCo8zfNogAFGiBj43Y4vz0BPzuHjdAlw92MHZIpbsqgAw5ZMuWMZQh+PKzsKxqW7h090N2mpbAm8/zMtrJUreKtqiyi5GHxaKPkiLKkIhD54UVrXa1DSev3vZExn9FwHojIsoMeCXxHIrXy8A2DkexGpgM0UsvTuP5WKlhS603Ct7qCs4DM8OUtbPNGMc/fo/qM+A/bikKrQAgginFgvUXsonD/qikmK0ARvSNnU8mr2UF9uDGJZ7x8Dxbf/EgWtmhYS3EiOIaVkY9WZHch2eek8soywg0vk++14lIxGzwnSOGeDp4ufgCTAOxPVsNLAdZU X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: af7b2152-1ec7-454d-d148-08dbad3a4cfc X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Sep 2023 11:30:11.6900 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8P250MB0280 Subject: [FFmpeg-devel] [PATCH 15/20] avformat/matroskadec: Factor generic parsing of video tracks out X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: MVuo5sgOHFyX Out of matroska_parse_tracks(), that is. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskadec.c | 188 +++++++++++++++++++++----------------- 1 file changed, 102 insertions(+), 86 deletions(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 97e944df7c..ec6ecb33cc 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -2111,7 +2111,7 @@ static int matroska_parse_flac(AVFormatContext *s, return 0; } -static int mkv_field_order(MatroskaDemuxContext *matroska, uint64_t field_order) +static int mkv_field_order(const MatroskaDemuxContext *matroska, uint64_t field_order) { int minor, micro, bttb = 0; @@ -2803,6 +2803,105 @@ static int mkv_parse_video_codec(MatroskaTrack *track, AVCodecParameters *par, return 0; } +/* Performs the generic part of parsing a video track. */ +static int mkv_parse_video(MatroskaTrack *track, AVStream *st, + AVCodecParameters *par, + const MatroskaDemuxContext *matroska, + int *extradata_offset) +{ + FFStream *const sti = ffstream(st); + MatroskaTrackPlane *planes = track->operation.combine_planes.elem; + int display_width_mul = 1; + int display_height_mul = 1; + int ret; + + if (track->video.color_space.size == 4) + par->codec_tag = AV_RL32(track->video.color_space.data); + + ret = mkv_parse_video_codec(track, par, matroska, + extradata_offset); + if (ret < 0) + return ret; + + + par->codec_type = AVMEDIA_TYPE_VIDEO; + par->width = track->video.pixel_width; + par->height = track->video.pixel_height; + + if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED) + par->field_order = mkv_field_order(matroska, track->video.field_order); + else if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE) + par->field_order = AV_FIELD_PROGRESSIVE; + + if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB) + mkv_stereo_mode_display_mul(track->video.stereo_mode, &display_width_mul, &display_height_mul); + + if (track->video.display_unit < MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN) { + if (track->video.display_width && track->video.display_height && + par->height < INT64_MAX / track->video.display_width / display_width_mul && + par->width < INT64_MAX / track->video.display_height / display_height_mul) + av_reduce(&st->sample_aspect_ratio.num, + &st->sample_aspect_ratio.den, + par->height * track->video.display_width * display_width_mul, + par->width * track->video.display_height * display_height_mul, + INT_MAX); + } + if (par->codec_id != AV_CODEC_ID_HEVC) + sti->need_parsing = AVSTREAM_PARSE_HEADERS; + + if (track->default_duration) { + int div = track->default_duration <= INT64_MAX ? 1 : 2; + av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den, + 1000000000 / div, track->default_duration / div, 30000); +#if FF_API_R_FRAME_RATE + if ( st->avg_frame_rate.num < st->avg_frame_rate.den * 1000LL + && st->avg_frame_rate.num > st->avg_frame_rate.den * 5LL) + st->r_frame_rate = st->avg_frame_rate; +#endif + } + + /* export stereo mode flag as metadata tag */ + if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB) + av_dict_set(&st->metadata, "stereo_mode", ff_matroska_video_stereo_mode[track->video.stereo_mode], 0); + + /* export alpha mode flag as metadata tag */ + if (track->video.alpha_mode) + av_dict_set_int(&st->metadata, "alpha_mode", 1, 0); + + /* if we have virtual track, mark the real tracks */ + for (int j = 0; j < track->operation.combine_planes.nb_elem; j++) { + MatroskaTrack *tracks = matroska->tracks.elem; + char buf[32]; + if (planes[j].type >= MATROSKA_VIDEO_STEREO_PLANE_COUNT) + continue; + snprintf(buf, sizeof(buf), "%s_%d", + matroska_video_stereo_plane[planes[j].type], st->index); + for (int k = 0; k < matroska->tracks.nb_elem; k++) + if (planes[j].uid == tracks[k].uid && tracks[k].stream) { + av_dict_set(&tracks[k].stream->metadata, + "stereo_mode", buf, 0); + break; + } + } + // add stream level stereo3d side data if it is a supported format + if (track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB && + track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_CYAN_RED && + track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_GREEN_MAG) { + int ret = mkv_stereo3d_conv(st, track->video.stereo_mode); + if (ret < 0) + return ret; + } + + ret = mkv_parse_video_color(st, track); + if (ret < 0) + return ret; + ret = mkv_parse_video_projection(st, track, matroska->ctx); + if (ret < 0) + return ret; + + return 0; +} + /* Performs the codec-specific part of parsing a subtitle track. */ static int mkv_parse_subtitle_codec(MatroskaTrack *track, AVCodecParameters *par, const MatroskaDemuxContext *matroska) @@ -2850,7 +2949,6 @@ static int matroska_parse_tracks(AVFormatContext *s) MatroskaDemuxContext *matroska = s->priv_data; MatroskaTrack *tracks = matroska->tracks.elem; int i, j, ret; - int k; for (i = 0; i < matroska->tracks.nb_elem; i++) { MatroskaTrack *track = &tracks[i]; @@ -3041,11 +3139,7 @@ static int matroska_parse_tracks(AVFormatContext *s) if (ret == SKIP_TRACK) continue; } else if (track->type == MATROSKA_TRACK_TYPE_VIDEO) { - if (track->video.color_space.size == 4) - par->codec_tag = AV_RL32(track->video.color_space.data); - - ret = mkv_parse_video_codec(track, par, matroska, - &extradata_offset); + ret = mkv_parse_video(track, st, par, matroska, &extradata_offset); if (ret < 0) return ret; } else if (track->type == MATROSKA_TRACK_TYPE_SUBTITLE) { @@ -3067,85 +3161,7 @@ static int matroska_parse_tracks(AVFormatContext *s) memcpy(par->extradata, src, extra_size); } - if (track->type == MATROSKA_TRACK_TYPE_VIDEO) { - MatroskaTrackPlane *planes = track->operation.combine_planes.elem; - int display_width_mul = 1; - int display_height_mul = 1; - - par->codec_type = AVMEDIA_TYPE_VIDEO; - par->width = track->video.pixel_width; - par->height = track->video.pixel_height; - - if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED) - par->field_order = mkv_field_order(matroska, track->video.field_order); - else if (track->video.interlaced == MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE) - par->field_order = AV_FIELD_PROGRESSIVE; - - if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB) - mkv_stereo_mode_display_mul(track->video.stereo_mode, &display_width_mul, &display_height_mul); - - if (track->video.display_unit < MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN) { - if (track->video.display_width && track->video.display_height && - par->height < INT64_MAX / track->video.display_width / display_width_mul && - par->width < INT64_MAX / track->video.display_height / display_height_mul) - av_reduce(&st->sample_aspect_ratio.num, - &st->sample_aspect_ratio.den, - par->height * track->video.display_width * display_width_mul, - par->width * track->video.display_height * display_height_mul, - INT_MAX); - } - if (par->codec_id != AV_CODEC_ID_HEVC) - sti->need_parsing = AVSTREAM_PARSE_HEADERS; - - if (track->default_duration) { - int div = track->default_duration <= INT64_MAX ? 1 : 2; - av_reduce(&st->avg_frame_rate.num, &st->avg_frame_rate.den, - 1000000000 / div, track->default_duration / div, 30000); -#if FF_API_R_FRAME_RATE - if ( st->avg_frame_rate.num < st->avg_frame_rate.den * 1000LL - && st->avg_frame_rate.num > st->avg_frame_rate.den * 5LL) - st->r_frame_rate = st->avg_frame_rate; -#endif - } - - /* export stereo mode flag as metadata tag */ - if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB) - av_dict_set(&st->metadata, "stereo_mode", ff_matroska_video_stereo_mode[track->video.stereo_mode], 0); - - /* export alpha mode flag as metadata tag */ - if (track->video.alpha_mode) - av_dict_set_int(&st->metadata, "alpha_mode", 1, 0); - - /* if we have virtual track, mark the real tracks */ - for (j=0; j < track->operation.combine_planes.nb_elem; j++) { - char buf[32]; - if (planes[j].type >= MATROSKA_VIDEO_STEREO_PLANE_COUNT) - continue; - snprintf(buf, sizeof(buf), "%s_%d", - matroska_video_stereo_plane[planes[j].type], i); - for (k=0; k < matroska->tracks.nb_elem; k++) - if (planes[j].uid == tracks[k].uid && tracks[k].stream) { - av_dict_set(&tracks[k].stream->metadata, - "stereo_mode", buf, 0); - break; - } - } - // add stream level stereo3d side data if it is a supported format - if (track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB && - track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_CYAN_RED && - track->video.stereo_mode != MATROSKA_VIDEO_STEREOMODE_TYPE_ANAGLYPH_GREEN_MAG) { - int ret = mkv_stereo3d_conv(st, track->video.stereo_mode); - if (ret < 0) - return ret; - } - - ret = mkv_parse_video_color(st, track); - if (ret < 0) - return ret; - ret = mkv_parse_video_projection(st, track, matroska->ctx); - if (ret < 0) - return ret; - } else if (track->type == MATROSKA_TRACK_TYPE_AUDIO) { + if (track->type == MATROSKA_TRACK_TYPE_AUDIO) { par->codec_type = AVMEDIA_TYPE_AUDIO; par->sample_rate = track->audio.out_samplerate; // channel layout may be already set by codec private checks above