From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id BE745472AA for ; Mon, 4 Sep 2023 11:46:24 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D8B5268C77C; Mon, 4 Sep 2023 14:46:21 +0300 (EEST) Received: from mail-ot1-f50.google.com (mail-ot1-f50.google.com [209.85.210.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BD4F968C07A for ; Mon, 4 Sep 2023 14:46:15 +0300 (EEST) Received: by mail-ot1-f50.google.com with SMTP id 46e09a7af769-6bca3311b4fso1069854a34.0 for ; Mon, 04 Sep 2023 04:46:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1693827974; x=1694432774; darn=ffmpeg.org; h=content-transfer-encoding:in-reply-to:from:references:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=f3tLqfBdre8t/xPxMwdP09kdvHzk3HmsmCGR/1cPAXA=; b=HkObKSrxtqb2T0yfGe8ox1XQJ6bY9isyXb1ZoC9ULXwz0CoHM27d9ygtEMGXXQ9Cip GfKsKLa25NQ/3kiYES8H8lulmWRNn69R/V1F6ge9hk34fAcx7DwBt3utK69x6TSz4RLU LtIuRTGOEfsm3N/GFkt2dhMBHPXtiGmk6/esFub3qTmimAd3Lo9gtrcMy83BlvWWBSCu QHSOPwuK3e+h2D4OtItjKiLWAlced1DkI35NMR8xPe7T86/LT6u2EQhUB7y0YYUyk/VP wYzp+lQU1xtdmu44hFO4cm8p4M4Yvd7jg0PXiEOpHxB6ON6cH1kX0CoJ1nfjRN26a3f+ w31Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1693827974; x=1694432774; h=content-transfer-encoding:in-reply-to:from:references:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=f3tLqfBdre8t/xPxMwdP09kdvHzk3HmsmCGR/1cPAXA=; b=Zcj/nMmV9BUjhoYAX6cTMt9POWh7LNr8IoEkcICxUygTuvTEdjsn9QacQkTpb1a3gd l8JiM0gZQchcCDabsxxryoWUHFPBWWzIpROKle2pTwRdD0Ox25vOsvmRLyprMwMmgo41 WeBQV9RHrvzbLn/Z654/c+Oufr4rFloZuPcwu0oCbKN5sWAkDAPAaeJBSDPgGCmw0yiE e3VSp2oJX9DgkxCfXYG74OEstYQ1blnu3ioN+e5aW89Ncp/AM0KpRjNHIf6v5VD0aFPp 6VEmH1eCsvK31vzh4WE6PlVYJbnnAPrvpbaQ+GqiO8KNvoZ7IlH5LO6gGzlsiqZRrEju p+oQ== X-Gm-Message-State: AOJu0YySQKWPr7a26AEKqe0EF71WJOj0OvgVNssZzn4UGrEsJP4HeSTu lsBWxQ35ARXAJ/PBeHWE3098J2Nutu4= X-Google-Smtp-Source: AGHT+IFww54G1Jc0Tm7B+kZRc3Mn80X2qO0GmeX0BhEWjYS46YHIisLtRPnmxhq/bf44wOH/f5u78A== X-Received: by 2002:a9d:7594:0:b0:6b8:7eef:a236 with SMTP id s20-20020a9d7594000000b006b87eefa236mr11126694otk.30.1693827973502; Mon, 04 Sep 2023 04:46:13 -0700 (PDT) Received: from [192.168.0.10] (host197.190-225-105.telecom.net.ar. [190.225.105.197]) by smtp.gmail.com with ESMTPSA id l3-20020a9d6a83000000b006b45be2fdc2sm4430639otq.65.2023.09.04.04.46.12 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 04 Sep 2023 04:46:13 -0700 (PDT) Message-ID: <2218fcb2-3078-861e-0583-3f8a96bc70f3@gmail.com> Date: Mon, 4 Sep 2023 08:46:17 -0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.15.0 Content-Language: en-US To: ffmpeg-devel@ffmpeg.org References: From: James Almer In-Reply-To: Subject: Re: [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 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="us-ascii"; Format="flowed" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: On 9/4/2023 8:27 AM, Andreas Rheinhardt wrote: > 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 This and the next patch should be squashed. There's no gain in legibility as you can see. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".