From patchwork Fri Apr 3 15:18:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lance Wang X-Patchwork-Id: 18590 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 8C72244A8E8 for ; Fri, 3 Apr 2020 18:18:24 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6AA2E68AEEA; Fri, 3 Apr 2020 18:18:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f173.google.com (mail-pl1-f173.google.com [209.85.214.173]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 593BF688118 for ; Fri, 3 Apr 2020 18:18:18 +0300 (EEST) Received: by mail-pl1-f173.google.com with SMTP id s23so2779051plq.13 for ; Fri, 03 Apr 2020 08:18:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=JoSFEGeWo2AHhqNAJLx3H7J2G88vuYyIqpmKS3zS8bE=; b=QUAEFdrY1VZPZtNiQJjewBA0U/4bmdTxk9I9swU9DHqBxL9LzU6pRChWnJ7vmmsVOr CAlLdH5LMXDumhycZbPs+eHFINRgMKN6MH4GvfoAx53/Siowxf1J34EDEUZld6QaOXPX z04bjjTlnqzS89cdWpLuZwHe6nd5VTcDtgeyhZQJGxjaibl6NBTUYvo0+i3DdaWMbwWk 8wuHbdXNbaGhjHGOZX3WNGwXZqzzpOHM2AABDr/Phk70rF1SUsjoGH45/Jh1nMGoDHEZ D8j2OcupWF0WMg58lwPqil8xfcXzOUbbeujGxVRoOl2mI4tWdKpgo/mcRdhLFq4Pdk2v cg6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=JoSFEGeWo2AHhqNAJLx3H7J2G88vuYyIqpmKS3zS8bE=; b=JzWWrsYmV4feOEe9jE0ax/OB8lZUaA12xy6Xn7CQI4DZ+O4F2uleehW6gfZsjpnou0 r3qT09W+u9clrWBC2iT120RwetiMsSGaSXQnAi5rQkGsawbDFVyOqW8mq4F4cA43KIT3 GLJEx4YpdlMF+f0UQhpayd9ME3QY8EDNkcOJ8TbBe9BpkTOyzzxgXNytzeN6hmciwpPX Ij6olvQT+rFTGuMwP6absBvrgDoHncx8TfYguS0bTmLWcamsKLL+7srvpw32MrKgGZn4 rH79DQq9KZQmg5qGzOkVBeE3jND0tClvhvskMPhIZVA7Sz+dpGIGNLMRLuxAdqxCRwuK FTFQ== X-Gm-Message-State: AGi0PuZEtWW5JArMVmkcelukLF4N68qdpqL9cR16seVO+a2T/4MlzvKC 9xblbTXBhhBdrospRfkTxFFE3vBG X-Google-Smtp-Source: APiQypLCzQbADfmtGVFmVUYD3qeyQQAygVzr/IODwr3rcmRYS/lfn8EArxwkdWBLQJcYNxp0M/AaSA== X-Received: by 2002:a17:902:464:: with SMTP id 91mr8541990ple.261.1585927096254; Fri, 03 Apr 2020 08:18:16 -0700 (PDT) Received: from vpn.localdomain ([47.90.99.151]) by smtp.gmail.com with ESMTPSA id 93sm6253399pjo.43.2020.04.03.08.18.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Apr 2020 08:18:15 -0700 (PDT) From: lance.lmwang@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 3 Apr 2020 23:18:11 +0800 Message-Id: <20200403151811.24325-1-lance.lmwang@gmail.com> X-Mailer: git-send-email 2.9.5 In-Reply-To: <20200403130454.25228-2-lance.lmwang@gmail.com> References: <20200403130454.25228-2-lance.lmwang@gmail.com> Subject: [FFmpeg-devel] [PATCH v2 2/2] avcodec/mpeg12enc: Support mpeg2 encoder profile with const options 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 Cc: Limin Wang MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Limin Wang make setting profile more user friendly Signed-off-by: Limin Wang --- doc/encoders.texi | 8 ++++++++ libavcodec/mpeg12enc.c | 22 +++++++++++++++++----- libavcodec/mpegvideo.h | 1 + 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/doc/encoders.texi b/doc/encoders.texi index e23b6b3..5022b94 100644 --- a/doc/encoders.texi +++ b/doc/encoders.texi @@ -2753,6 +2753,14 @@ For maximum compatibility, use @samp{component}. @item a53cc @var{boolean} Import closed captions (which must be ATSC compatible format) into output. Default is 1 (on). +@item profile @var{integer} +Select the mpeg2 profile to encode, possible values: +@table @samp +@item 422 +@item high +@item main +@item simple +@end table @end table @section png diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c index 643ba81..2f4c889 100644 --- a/libavcodec/mpeg12enc.c +++ b/libavcodec/mpeg12enc.c @@ -156,23 +156,30 @@ static av_cold int encode_init(AVCodecContext *avctx) } } - if (avctx->profile == FF_PROFILE_UNKNOWN) { + if (avctx->profile != FF_PROFILE_UNKNOWN) + s->profile = avctx->profile; + + if (s->profile == FF_PROFILE_UNKNOWN) { if (avctx->level != FF_LEVEL_UNKNOWN) { av_log(avctx, AV_LOG_ERROR, "Set profile and level\n"); return -1; } /* Main or 4:2:2 */ avctx->profile = s->chroma_format == CHROMA_420 ? FF_PROFILE_MPEG2_MAIN : FF_PROFILE_MPEG2_422; + s->profile = s->chroma_format == CHROMA_420 ? FF_PROFILE_MPEG2_MAIN : FF_PROFILE_MPEG2_422; + } else if (s->profile < FF_PROFILE_MPEG2_422) { + av_log(avctx, AV_LOG_ERROR, "Invalid mpeg2 profile set\n"); + return -1; } if (avctx->level == FF_LEVEL_UNKNOWN) { - if (avctx->profile == FF_PROFILE_MPEG2_422) { /* 4:2:2 */ + if (s->profile == FF_PROFILE_MPEG2_422) { /* 4:2:2 */ if (avctx->width <= 720 && avctx->height <= 608) avctx->level = 5; /* Main */ else avctx->level = 2; /* High */ } else { - if (avctx->profile != FF_PROFILE_MPEG2_HIGH && s->chroma_format != CHROMA_420) { + if (s->profile != FF_PROFILE_MPEG2_HIGH && s->chroma_format != CHROMA_420) { av_log(avctx, AV_LOG_ERROR, "Only High(1) and 4:2:2(0) profiles support 4:2:2 color sampling\n"); return -1; @@ -321,9 +328,9 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s) put_header(s, EXT_START_CODE); put_bits(&s->pb, 4, 1); // seq ext - put_bits(&s->pb, 1, s->avctx->profile == FF_PROFILE_MPEG2_422); // escx 1 for 4:2:2 profile + put_bits(&s->pb, 1, s->profile == FF_PROFILE_MPEG2_422); // escx 1 for 4:2:2 profile - put_bits(&s->pb, 3, s->avctx->profile); // profile + put_bits(&s->pb, 3, s->profile); // profile put_bits(&s->pb, 4, s->avctx->level); // level put_bits(&s->pb, 1, s->progressive_sequence); @@ -1165,6 +1172,11 @@ static const AVOption mpeg2_options[] = { { "secam", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VIDEO_FORMAT_SECAM }, 0, 0, VE, "video_format" }, { "mac", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VIDEO_FORMAT_MAC }, 0, 0, VE, "video_format" }, { "unspecified", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VIDEO_FORMAT_UNSPECIFIED}, 0, 0, VE, "video_format" }, + { "profile", "Set the profile", OFFSET(profile), AV_OPT_TYPE_INT,{ .i64 = FF_PROFILE_UNKNOWN }, FF_PROFILE_UNKNOWN, FF_PROFILE_MPEG2_SIMPLE, VE, "profile" }, + { "422", "", 0, AV_OPT_TYPE_CONST,{ .i64 = FF_PROFILE_MPEG2_422 }, 0, 0, VE, "profile" }, + { "high", "", 0, AV_OPT_TYPE_CONST,{ .i64 = FF_PROFILE_MPEG2_HIGH }, 0, 0, VE, "profile" }, + { "main", "", 0, AV_OPT_TYPE_CONST,{ .i64 = FF_PROFILE_MPEG2_MAIN }, 0, 0, VE, "profile" }, + { "simple", "", 0, AV_OPT_TYPE_CONST,{ .i64 = FF_PROFILE_MPEG2_SIMPLE }, 0, 0, VE, "profile" }, FF_MPV_COMMON_OPTS { NULL }, }; diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h index 29e692f..cee423e 100644 --- a/libavcodec/mpegvideo.h +++ b/libavcodec/mpegvideo.h @@ -456,6 +456,7 @@ typedef struct MpegEncContext { int progressive_sequence; int mpeg_f_code[2][2]; int a53_cc; + int profile; // picture structure defines are loaded from mpegutils.h int picture_structure;