From patchwork Sat Apr 4 00:25:31 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lance Wang X-Patchwork-Id: 18625 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 2E6E244BB16 for ; Sat, 4 Apr 2020 03:25:46 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 0B28868AFB7; Sat, 4 Apr 2020 03:25:46 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf1-f196.google.com (mail-pf1-f196.google.com [209.85.210.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DE90A68AF66 for ; Sat, 4 Apr 2020 03:25:38 +0300 (EEST) Received: by mail-pf1-f196.google.com with SMTP id r14so4418972pfl.12 for ; Fri, 03 Apr 2020 17:25:38 -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=M0lgPcCd5/8g6w94EWZ0BGjsldslJDy8YBGWnDKteNI=; b=Bkl075QTx7q0whc1asnkWLRRozGCK1dM26FV6ipGAvxReu2h28AIWQ/fgbfWeeCjvV voItsMl9h5G+fAEPWRZNt3vDANTiKlXhQIr/TRFQF33mAhhTZamkVV2sjU2wup0ug7oL wpawDK9+RT0DzgeO9jDmJgjVuo+Nq2KxwXWVshofbi/Z96frM4mWZa2k1rZE+xEjwsPh CS4j0mw+xN9/Z6APf5bJJx4zMIMfyTQbahuv/6nWb/TNMZ3E5QOIvqUInpVo8lgG0NHZ BGLHhum/YMwfJETPgaV3ghGgtsfBXjEhFgAKie8ihLv+D5NAEE50TupNLtsYSrSuf4Ke pjtA== 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=M0lgPcCd5/8g6w94EWZ0BGjsldslJDy8YBGWnDKteNI=; b=XOhASSx8CUrD0xZceNvJui4H7odQQcKS0pzDZpmaCSmSEw+sF1Ca3zObA+SgrFYN/7 EBJOuBmhDglpcyzqTlFBwOFAXrDJeb92qB/fUkOlCPVKhhgGRDjypeC5mCjrozNDeeyb 7mbD+G/ZDTlzqu6hMlmCLw62UOPwGpI9m0JXwD4+MMFtjKb2/lMrmul1RUtMHJ68AaKH GubGBXgn517pP/Apl+xVs0877Igl6aACf9o1dFuVuaDjQ3Y5oBDszV/YPd1nfxqwGER8 F/aWOKCCHfETqxww5IHP+azJ1c0Q9m/pMfFio9Qu+9yXYcg/zD4SeQvh3P6dohX7vQYu YrtQ== X-Gm-Message-State: AGi0Pubsuzx996jVMdItfu1b6gVtpdcJO/s8184egn6fB+Vcm4CyzEAJ w6LYtQpVz+oqC0qjnkVgQOZYgqN9 X-Google-Smtp-Source: APiQypINeLsqjzqXX897eTM2BqRXmglFhwlsv6F5BKHj3zG7cqs5AO5jNt9aWLUuS5TViYJHxQJJOQ== X-Received: by 2002:a63:774c:: with SMTP id s73mr10992409pgc.47.1585959936572; Fri, 03 Apr 2020 17:25:36 -0700 (PDT) Received: from vpn.localdomain ([47.90.99.151]) by smtp.gmail.com with ESMTPSA id q15sm6573480pfn.89.2020.04.03.17.25.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 03 Apr 2020 17:25:35 -0700 (PDT) From: lance.lmwang@gmail.com To: ffmpeg-devel@ffmpeg.org Date: Sat, 4 Apr 2020 08:25:31 +0800 Message-Id: <20200404002531.32552-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 v3 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 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..9fe0c8b 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 (s->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;