From patchwork Thu Jun 28 08:32:01 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Cao X-Patchwork-Id: 9548 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:104:0:0:0:0:0 with SMTP id c4-v6csp1808536jad; Thu, 28 Jun 2018 01:32:29 -0700 (PDT) X-Google-Smtp-Source: AAOMgpdu6kmNAargl9j87BO6lBkfhsfLCD3Fi50XRpTLVz/Q7sj6Kwks0bxHSUvmBnH7hT27TTBL X-Received: by 2002:adf:f783:: with SMTP id q3-v6mr6976694wrp.108.1530174749168; Thu, 28 Jun 2018 01:32:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1530174749; cv=none; d=google.com; s=arc-20160816; b=MvnoM8h8BZbN4Wz4dgTTEVRxYjBEzDkLlo4x41uAQlzE/EJtEz8TzFiQQLg/7WGqPJ B2rSxbgpY9FHwYjAVzYzRGOJUD6OBxU0gGDvqQnfm/8XPfy8Mi/5cl/7qh40RWQ985xo X5Ln3N7bziE2biS3J0FC9MSx9buwvdyOEffPOuuZOp+0JJ7Biik0YVi0m4RooPMzE0fq YGc+OAyLsGE+kuU/KgLiqHa4gjizeqRxhR8/xf2Hem8wKuB9ruXbRtgDwmckmqpPB5Ri tJW0JfYBRbwBXj6QGtte8MtsLjnVs0FIvSNu42rG31nXSqqKn29nc/yYpfxc3ArUwec8 R/kg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=1E9vJGuPZSyi7YbSfv2KMqTb4VqhCi0KRy0Comzy70I=; b=0ADt8ciX05UrMKRwKoFgK41423c8/+5RVN8//qytMomjtgNR6dTK5no3Jr77NBVP2c l6hCgv5TPcbVajWL0i+3LJWz9GoDOdWxgj3nM/fpQ5hmMl0vVcnuCWMm1Od/x2QE+G/E fMNMCCVOyRqJ181QCR7LV+9jf8Di0hEwyfYqVh2DaUb2BfadtGIIqB99TPRk7nGiVn0f VAQOgz7K4am5u8YEhEyXhaFYY2AtTl3je69U3uQGZxmPjQkBZHAgNOG3eHN0lvhIiByF EK/InlWzZ/TAj9X1uAfsbnGjjCn5u4kO44l/Ax+zHodlwpeUZWk6oZ1hcQd7nQfwJYTD IxoQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=J0yhVcYd; 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=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id j142-v6si5579155wmg.197.2018.06.28.01.32.28; Thu, 28 Jun 2018 01:32:29 -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 header.s=20161025 header.b=J0yhVcYd; 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=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 75BA168A58A; Thu, 28 Jun 2018 11:32:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl0-f68.google.com (mail-pl0-f68.google.com [209.85.160.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3F7F668A57E for ; Thu, 28 Jun 2018 11:32:14 +0300 (EEST) Received: by mail-pl0-f68.google.com with SMTP id y15-v6so536034pll.9 for ; Thu, 28 Jun 2018 01:32:15 -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=EhZ2OueEmFkppDBnlObJaXzHT9JRXZ5fZ658VP94c74=; b=J0yhVcYdlTab/HW6faXrzUburJ12nDGvpU8WtwNugulHsr46oWfjW9lSOkn1Vr0Sj3 JSIw1ZrFYh7F/c8Iz4cLizFSANvYVlwx1J411oAbTRpMsHiMZJsog2Px8tlJFpKktNK7 NisbHUIKR2s9cyM1i7dfFKGp9CA4rV0Uo9SjOyAbuXeUZac5aI10IyVf1iUn/8i+4MsM Cw9ywahjqnlnI0D/BNQ9q+moOIUKJP4Mc1lPARs5RST84vhEM/sTSSJduP8WY0fAsyOL qinBeqmoVyVOP0HtBKl9k24gOv79kNr2IilkVTz33xKcVGYUOW4GtjNo7NICP7V/QnGU dPow== 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=EhZ2OueEmFkppDBnlObJaXzHT9JRXZ5fZ658VP94c74=; b=YITlJu5iIZ6Jouzx+TYgZDIYwh4Dv+B4MdkCfB6LQrY++faCNcdK5JhC5RN/iwpn+D 5It6epYzHPBt86HGgVXq5nR1bOk8wC1C3t2V7AoZviL0KNq9+cw10H6187k5BK2igh34 zBo92MvcLANq20+357WDsPPGJPvxVKRY77Yya7ySsI+RD33CYLsaV1vITG4tTKZM+U8K sFNYqwaARTWqaSGsVfXdrQE7jK4kfQkJcndncsh6K2nTDuMQJ3786KUqCkycGkdGiCH5 OOmWP9LLlNDKx9cn4ajQbk18zDEgC/u727pDK5FFbb8qziUz2D1vI30v6R9TfUAXEOxI arOw== X-Gm-Message-State: APt69E0q4mk7TRzjYh/rRUnoQJAU+mcpETEoybo2j6OWAVkn3T7kOAUV 1Biealxur8axF0esVM7n72KWyUeJ X-Received: by 2002:a17:902:5501:: with SMTP id f1-v6mr9505741pli.108.1530174734252; Thu, 28 Jun 2018 01:32:14 -0700 (PDT) Received: from wangcao1.bej.corp.google.com ([2401:fa00:44:10:97fa:2969:3ac1:d58e]) by smtp.gmail.com with ESMTPSA id p20-v6sm9275793pfn.181.2018.06.28.01.32.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 28 Jun 2018 01:32:13 -0700 (PDT) From: Wang Cao X-Google-Original-From: Wang Cao To: ffmpeg-devel@ffmpeg.org Date: Thu, 28 Jun 2018 16:32:01 +0800 Message-Id: <20180628083201.33755-2-wangcao@google.com> X-Mailer: git-send-email 2.18.0.rc2.346.g013aa6912e-goog In-Reply-To: <20180628083201.33755-1-wangcao@google.com> References: <20180625233726.GK4859@michaelspb> <20180628083201.33755-1-wangcao@google.com> Subject: [FFmpeg-devel] [PATCH] libavformat/yuv4mpeg: Add color range support for Y4M Add color_range support in Y4M. 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: Wang Cao MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Set pixel format and color_range for YUVJ pixel formats. Also set color_range based on AVFormatContext. Signed-off-by: Wang Cao --- libavformat/yuv4mpegdec.c | 8 ++++++++ libavformat/yuv4mpegenc.c | 37 +++++++++++++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/libavformat/yuv4mpegdec.c b/libavformat/yuv4mpegdec.c index eff7fc518e..855fadbb31 100644 --- a/libavformat/yuv4mpegdec.c +++ b/libavformat/yuv4mpegdec.c @@ -41,6 +41,7 @@ static int yuv4_read_header(AVFormatContext *s) enum AVPixelFormat pix_fmt = AV_PIX_FMT_NONE, alt_pix_fmt = AV_PIX_FMT_NONE; enum AVChromaLocation chroma_sample_location = AVCHROMA_LOC_UNSPECIFIED; enum AVFieldOrder field_order = AV_FIELD_UNKNOWN; + enum AVColorRange color_range = AVCOL_RANGE_UNSPECIFIED; AVStream *st; for (i = 0; i < MAX_YUV4_HEADER; i++) { @@ -220,6 +221,12 @@ static int yuv4_read_header(AVFormatContext *s) alt_pix_fmt = AV_PIX_FMT_YUV422P; else if (strncmp("444", tokstart, 3) == 0) alt_pix_fmt = AV_PIX_FMT_YUV444P; + } else if (strncmp("COLORRANGE=", tokstart, 11) == 0) { + tokstart += 11; + if (strncmp("FULL",tokstart, 4) == 0) + color_range = AVCOL_RANGE_JPEG; + else if (strncmp("LIMITED", tokstart, 7) == 0) + color_range = AVCOL_RANGE_MPEG; } while (tokstart < header_end && *tokstart != 0x20) tokstart++; @@ -263,6 +270,7 @@ static int yuv4_read_header(AVFormatContext *s) st->codecpar->codec_id = AV_CODEC_ID_RAWVIDEO; st->sample_aspect_ratio = (AVRational){ aspectn, aspectd }; st->codecpar->chroma_location = chroma_sample_location; + st->codecpar->color_range = color_range; st->codecpar->field_order = field_order; s->packet_size = av_image_get_buffer_size(st->codecpar->format, width, height, 1) + Y4M_FRAME_MAGIC_LEN; if ((int) s->packet_size < 0) diff --git a/libavformat/yuv4mpegenc.c b/libavformat/yuv4mpegenc.c index 44f40bbad9..e84dbf9568 100644 --- a/libavformat/yuv4mpegenc.c +++ b/libavformat/yuv4mpegenc.c @@ -33,6 +33,7 @@ static int yuv4_generate_header(AVFormatContext *s, char* buf) int raten, rated, aspectn, aspectd, n; char inter; const char *colorspace = ""; + const char *colorrange = ""; int field_order; st = s->streams[0]; @@ -57,6 +58,17 @@ static int yuv4_generate_header(AVFormatContext *s, char* buf) FF_ENABLE_DEPRECATION_WARNINGS #endif + switch(st->codecpar->color_range) { + case AVCOL_RANGE_MPEG: + colorrange = " XCOLORRANGE=LIMITED"; + break; + case AVCOL_RANGE_JPEG: + colorrange = " XCOLORRANGE=FULL"; + break; + default: + break; + } + switch (field_order) { case AV_FIELD_TB: case AV_FIELD_TT: inter = 't'; break; @@ -84,6 +96,18 @@ static int yuv4_generate_header(AVFormatContext *s, char* buf) case AV_PIX_FMT_YUV411P: colorspace = " C411 XYSCSS=411"; break; + case AV_PIX_FMT_YUVJ420P: + colorspace = " C420jpeg XYSCSS=420JPEG"; + colorrange = " XCOLORRANGE=FULL"; + break; + case AV_PIX_FMT_YUVJ422P: + colorspace = " C422 XYSCSS=422"; + colorrange = " XCOLORRANGE=FULL"; + break; + case AV_PIX_FMT_YUVJ444P: + colorspace = " C444 XYSCSS=444"; + colorrange = " XCOLORRANGE=FULL"; + break; case AV_PIX_FMT_YUV420P: switch (st->codecpar->chroma_location) { case AVCHROMA_LOC_TOPLEFT: colorspace = " C420paldv XYSCSS=420PALDV"; break; @@ -145,13 +169,14 @@ static int yuv4_generate_header(AVFormatContext *s, char* buf) } /* construct stream header, if this is the first frame */ - n = snprintf(buf, Y4M_LINE_MAX, "%s W%d H%d F%d:%d I%c A%d:%d%s\n", + n = snprintf(buf, Y4M_LINE_MAX, "%s W%d H%d F%d:%d I%c A%d:%d%s%s\n", Y4M_MAGIC, width, height, raten, rated, inter, - aspectn, aspectd, colorspace); + aspectn, aspectd, colorspace, colorrange); return n; } + static int yuv4_write_packet(AVFormatContext *s, AVPacket *pkt) { AVStream *st = s->streams[pkt->stream_index]; @@ -192,6 +217,10 @@ static int yuv4_write_packet(AVFormatContext *s, AVPacket *pkt) case AV_PIX_FMT_YUV420P: case AV_PIX_FMT_YUV422P: case AV_PIX_FMT_YUV444P: + // TODO: remove YUVJ pixel formats when they are completely removed from the codebase. + case AV_PIX_FMT_YUVJ420P: + case AV_PIX_FMT_YUVJ422P: + case AV_PIX_FMT_YUVJ444P: break; case AV_PIX_FMT_GRAY9: case AV_PIX_FMT_GRAY10: @@ -271,6 +300,10 @@ static int yuv4_write_header(AVFormatContext *s) case AV_PIX_FMT_YUV420P: case AV_PIX_FMT_YUV422P: case AV_PIX_FMT_YUV444P: + // TODO: remove YUVJ pixel formats when they are completely removed from the codebase. + case AV_PIX_FMT_YUVJ420P: + case AV_PIX_FMT_YUVJ422P: + case AV_PIX_FMT_YUVJ444P: break; case AV_PIX_FMT_GRAY9: case AV_PIX_FMT_GRAY10: