From patchwork Tue Apr 24 18:54:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Keroulas X-Patchwork-Id: 8630 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp2179701jad; Tue, 24 Apr 2018 11:55:23 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/SSg6wvGedHqHyNBXK6I98i8n/+2hDCB1YiAckLD1fRHOsPdXrSo8PUB9WtNTxKWv4gE9r X-Received: by 10.28.88.141 with SMTP id m135mr13484350wmb.156.1524596123084; Tue, 24 Apr 2018 11:55:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524596123; cv=none; d=google.com; s=arc-20160816; b=U69ACAEI8dM1wTo50jUtgeA9FCGbvPFpQiNkyeC5mB0y4C2hWEz4xoHbhfaGNgoaGc cAZLMGY98ss3BrVJLsN5ID7GpiUUjVRBw58t5um1TeOtG6ZoQCZJS5H/l9k9dMZPHd1p 73BxW+YIaMpcWrZk/8jrqOeJsh8F0953yqk3W2CpBJCepfgxZP6r2djfmdJ2cOZXOA+Q U7b9THX1Wa85jdJstRK/6TLIvXzeLVV6SpENbSRh2CGy62PVTWOVyR5/LdSnZzxPzMZ7 bAKbkQ6CPWb3ObPzZjSPJL7rIGBryDRXLvyVzloMS6L41iGUnsAQhOFhlracEVLa5Did 455Q== 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:delivered-to:arc-authentication-results; bh=dRuT2IoTgXXMiIZk/Ox1RFieFNfs1jPvEGYjWaPWa8c=; b=vtUcle9aiEUJ+4RjxRAanMyfOlA+GBuaIac+N9BAzb5ag86fDgVH5JlZSKkbW/G+1Y 1/nMc5uErEXCra2H+GmhDiI5HWhy7bo/vRC8bUrt2kDOlCiSZqoHYesUHoxbybYmUc0L X3hHVyA6IQ+0cPPUf+IbL9M8i8xgVOCq+o7uQMzqOuL+8ueqoCHFtnZOQzyMKxEXVe6F iAUi6KVv+YeRCw3czow4gAlwEmnG0U21YACPZQ/4SuMVW3v0MuFzA57FZt5rkJVFMneA dRkkwFxnuY8mtZGWL1Z1uLyUwMMXKus1FIybwDOQT9iqw1O3LkP2+cAAHwgbUjgqXZpg xWxw== ARC-Authentication-Results: i=1; mx.google.com; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id e71si7539445wmd.91.2018.04.24.11.55.22; Tue, 24 Apr 2018 11:55:23 -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; 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 Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F33C068A270; Tue, 24 Apr 2018 21:54:50 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.savoirfairelinux.com (mail.savoirfairelinux.com [208.88.110.44]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1187568A270 for ; Tue, 24 Apr 2018 21:54:45 +0300 (EEST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 2893B9C356A for ; Tue, 24 Apr 2018 14:55:14 -0400 (EDT) Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavisd-new, port 10032) with ESMTP id K8qR0FUyerke; Tue, 24 Apr 2018 14:55:13 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id A1E389C3569; Tue, 24 Apr 2018 14:55:13 -0400 (EDT) X-Virus-Scanned: amavisd-new at mail.savoirfairelinux.com Received: from mail.savoirfairelinux.com ([127.0.0.1]) by localhost (mail.savoirfairelinux.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id FOA_TQj62xHC; Tue, 24 Apr 2018 14:55:13 -0400 (EDT) Received: from pkeroulas.media.in.cbcsrc.ca (unknown [192.168.50.171]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 789429C3568; Tue, 24 Apr 2018 14:55:13 -0400 (EDT) From: Patrick Keroulas To: ffmpeg-devel@ffmpeg.org Date: Tue, 24 Apr 2018 14:54:53 -0400 Message-Id: <1524596093-27630-3-git-send-email-patrick.keroulas@savoirfairelinux.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1524596093-27630-1-git-send-email-patrick.keroulas@savoirfairelinux.com> References: <1524596093-27630-1-git-send-email-patrick.keroulas@savoirfairelinux.com> Subject: [FFmpeg-devel] [PATCH v3 3/3] avformat/rtpdec_rfc4175: handle interlace format 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: Damien Riegel , Patrick Keroulas MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Damien Riegel In order to handle the interlaced formats, the demuxer has only a few things to do: - parse the SDP correctly and propagate the information - check the field bit in the RFC4175 header, and pass that information to the decoder In interlaced mode, received data only consist of fields, and their heights are half of the frame size, so some adjustments must be done here and there to take that into account. Signed-off-by: Damien Riegel Signed-off-by: Patrick Keroulas --- libavformat/rtpdec_rfc4175.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/libavformat/rtpdec_rfc4175.c b/libavformat/rtpdec_rfc4175.c index e9c62c1..9dc7b29 100644 --- a/libavformat/rtpdec_rfc4175.c +++ b/libavformat/rtpdec_rfc4175.c @@ -31,6 +31,8 @@ struct PayloadContext { int depth; int width; int height; + int interlaced; + int field; uint8_t *frame; unsigned int frame_size; @@ -65,10 +67,18 @@ static int rfc4175_parse_format(AVStream *stream, PayloadContext *data) return AVERROR_INVALIDDATA; } + if (data->interlaced) + stream->codecpar->field_order = AV_FIELD_TT; + else + stream->codecpar->field_order = AV_FIELD_PROGRESSIVE; + stream->codecpar->format = pixfmt; stream->codecpar->codec_tag = tag; stream->codecpar->bits_per_coded_sample = bits_per_sample; - data->frame_size = data->width * data->height * data->pgroup / data->xinc; + if (data->interlaced) + data->frame_size = data->width * (data->height / 2) * data->pgroup / data->xinc; + else + data->frame_size = data->width * data->height * data->pgroup / data->xinc; return 0; } @@ -85,6 +95,8 @@ static int rfc4175_parse_fmtp(AVFormatContext *s, AVStream *stream, data->sampling = av_strdup(value); else if (!strncmp(attr, "depth", 5)) data->depth = atoi(value); + else if (!strncmp(attr, "interlace", 9)) + data->interlaced = 1; return 0; } @@ -131,7 +143,13 @@ static int rfc4175_finalize_packet(PayloadContext *data, AVPacket *pkt, av_freep(&data->frame); } + /* In the packet header, the field is set to 0 for top field + * and 1 for bottom */ + if (data->interlaced) + pkt->flags |= data->field ? AV_PKT_FLAG_BOTTOM_FIELD : AV_PKT_FLAG_TOP_FIELD; + data->frame = NULL; + data->field = 0; return ret; } @@ -141,7 +159,7 @@ static int rfc4175_handle_packet(AVFormatContext *ctx, PayloadContext *data, const uint8_t * buf, int len, uint16_t seq, int flags) { - int length, line, offset, cont; + int length, line, offset, cont, field; const uint8_t *headers = buf + 2; /* skip extended seqnum */ const uint8_t *payload = buf + 2; int payload_len = len - 2; @@ -194,11 +212,14 @@ static int rfc4175_handle_packet(AVFormatContext *ctx, PayloadContext *data, return AVERROR_INVALIDDATA; length = (headers[0] << 8) | headers[1]; + field = (headers[2] & 0x80); line = ((headers[2] & 0x7f) << 8) | headers[3]; offset = ((headers[4] & 0x7f) << 8) | headers[5]; cont = headers[4] & 0x80; headers += 6; + data->field = field; + if (length % data->pgroup) return AVERROR_INVALIDDATA;