From patchwork Wed Jun 13 16:03:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wang Cao X-Patchwork-Id: 9390 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:11c:0:0:0:0:0 with SMTP id c28-v6csp818340jad; Wed, 13 Jun 2018 09:03:49 -0700 (PDT) X-Google-Smtp-Source: ADUXVKKrESKAXerbW1H263QinHUQUnouyqIcN4Np9il+5BnIdct08b08M+jUfT6bOWyZwGunmo3U X-Received: by 2002:adf:b92d:: with SMTP id k42-v6mr4753732wrf.116.1528905829849; Wed, 13 Jun 2018 09:03:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1528905829; cv=none; d=google.com; s=arc-20160816; b=kT4+MOkpe8zcO6Wg6psJGe17e+gPHzGAQV2XPcr39m9X5YSJoVxEEUiBxW+Vl4kv2P Myb+DessIWyJARs4leAqSIw5r8zD+Psi+IcvIU3dE5YZHi3Owwhe/OFOpnXn1RzYBHg9 GgeUEfnoa7A3j3aa4xJoWcPeu6lbd2A5vvNDaYUb18HPgW8EOT7mjRfetUnNMr14qJBe 3XCcs/NvCkzPUSLheonRimPS5WNtjlj8PPTS1EcdpIltg+xmnt7NH9TG5V2UkbsYgt7Z mJLdIXuFtlREslYQeMBaOiCtiYw7/fv885i7SXHQi7+XXV+eNhoqyIk1sX31v9WOJDsV Qd1Q== 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:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=ivuIdtOdM/FXieZ/RMfWW9UQxEXzc7ytoou/GMvFGw4=; b=Lr2UBenCHclRipOiUzhvp8ERv2pxQLUAvYqCLrTfjQPDa+CrU5M0SJsCeThB6GL2uu LYOzj733yrpIL91RJ1WwT7XUusBpu3KeprcKkcV5GVrT1jLw5u0f0pdouuVbwN4mbefJ pMQkJR8u6bhbjGyfb9sFX8P+NhjhOOIvzkUwQMOULVXYq5fc3iIaXD/xNf/QN0APzPrR HJuviCdvejGEvCPfjVI9ywK+QWMyBZrELbZyASQ89Zpalsl6/9ynVVgV9LleYKUt1cXS ha9/2UQN+jF4wQ5LkA1vWkxeV1M52h5XExrcHxgeAMXMQvKQOqzTAC3vKgbCxgKug9FA l77Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=c2XuFnM4; 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 h9-v6si2508973wrp.127.2018.06.13.09.03.36; Wed, 13 Jun 2018 09:03:49 -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=c2XuFnM4; 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 6998A68B0DF; Wed, 13 Jun 2018 19:02:44 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f177.google.com (mail-pf0-f177.google.com [209.85.192.177]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8E45C68AEFD for ; Wed, 13 Jun 2018 19:02:37 +0300 (EEST) Received: by mail-pf0-f177.google.com with SMTP id a12-v6so1662115pfi.3 for ; Wed, 13 Jun 2018 09:03:27 -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; bh=jYyn0GnNJDFdP3u2W5KwOFtXIjC1KmXm7TxGJoW/iTU=; b=c2XuFnM4rfaX4v6VkrKjDgcqgiqN50/w5A20xHT38jEZ53egyPf9sfbaE0Q3cw6+NH z9A3/CCHUI9l8H2bV676aovVaC4Fq0d+qCa0pF2I1SVYdPZjQTcMePx3dgkwFRMSolF3 5XG8y1aTrVjeMo7PFFPoirxX2posVVjDKjg2ymruTD4Atr/77w2XyzwVoUiUMuXsAGPq eQL1IXWYTOu4NM6SNKPG/+Wqmw4u3AYHQp8mwBvoHPFK2PHQfopgMzqyW+Yn56Ncmitd dLpV9x/kmhy0JVN0Vc+3KOPAwCzhE3npzg5WIIhB0xp6Lm+Cs+827Hj5SxUww/RzRmpA qNxg== 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; bh=jYyn0GnNJDFdP3u2W5KwOFtXIjC1KmXm7TxGJoW/iTU=; b=PpEpjaFf9hjvqlx6AIsGll67UDazeUbLxHm8nbcckefII5aVZs7iv7zEzAl3JG77KK i8e0lu2gw2NzIMHprJ3uPjwUVtZa5PpEiEUDVGzzT8o0FNGgQ9rGNe/GBqKCu7uP6Yho S6onrcJW9WBXVocU5/1xITqi5BAVsWcWByLe9UKJDWEZJDhUIgdp7R4g4DNZeowTx5L7 8OttLVL9pNOywbBJRPQlID/TcgjDs5Db5Vwb0MO00lBTcZaInGjQb1xjivMhP8teCM1r yssJ884RQa7PZxHTrzLsXCxJmmFE00lsUCmBNR7mSwN9rk2zQcPeSZrJVqxTfGL2y800 99BQ== X-Gm-Message-State: APt69E256AQZ6EKxw+WbAojl9m0I6PfL/tw/+EiXPoFjt+L2s0lZdFZ/ 9oxptrlfNscxV1BdEbDqEm0Hmt2w/TI= X-Received: by 2002:a62:fe19:: with SMTP id z25-v6mr5393439pfh.167.1528905805930; Wed, 13 Jun 2018 09:03:25 -0700 (PDT) Received: from wangcao.bej.corp.google.com ([100.109.153.84]) by smtp.gmail.com with ESMTPSA id y10-v6sm4139041pgr.44.2018.06.13.09.03.22 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 13 Jun 2018 09:03:23 -0700 (PDT) From: Wang Cao X-Google-Original-From: Wang Cao To: ffmpeg-devel@ffmpeg.org Date: Thu, 14 Jun 2018 00:03:13 +0800 Message-Id: <20180613160313.164743-1-wangcao@google.com> X-Mailer: git-send-email 2.18.0.rc1.242.g61856ae69a-goog Subject: [FFmpeg-devel] [PATCH] libavformat/yuv4mpeg: Add color range support for Y4M Add color_range support in Y4M. Also set pixel format and color_range for YUVJ pixel formats. 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" --- 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..86e8673b2f 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("JPEG",tokstart, 4) == 0) + color_range = AVCOL_RANGE_JPEG; + else if (strncmp("MPEG", tokstart, 4) == 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..555ef15105 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=MPEG"; + break; + case AVCOL_RANGE_JPEG: + colorrange = " XCOLORRANGE=JPEG"; + 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=JPEG"; + break; + case AV_PIX_FMT_YUVJ422P: + colorspace = " C422 XYSCSS=422"; + colorrange = " XCOLORRANGE=JPEG"; + break; + case AV_PIX_FMT_YUVJ444P: + colorspace = " C444 XYSCSS=444"; + colorrange = " XCOLORRANGE=JPEG"; + 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: