From patchwork Mon May 14 22:26:37 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Keroulas X-Patchwork-Id: 8967 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp648431jad; Mon, 14 May 2018 15:26:48 -0700 (PDT) X-Google-Smtp-Source: AB8JxZp3W+NQgtZuZ7ptmhoNxYJOdHOVRw/ToqGPJx7GATQHaUInZzR3d5fI9QeHYg5Nzkqmj+pU X-Received: by 2002:adf:b067:: with SMTP id g36-v6mr8375104wra.128.1526336808371; Mon, 14 May 2018 15:26:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526336808; cv=none; d=google.com; s=arc-20160816; b=xDPK6xZTlyuwlYraWxrSZBUxKMaYbJRS4DgMghO6lVqwpJG/10AbjV/H8HcpDTt10E G1FrE2GRTLhlAA3HHRVKZVje7Kmh56g5TXhOD2QKZP0mEin94E/0gDyPH1VNVAqJPkwn DmOdh56Nze5ChMvryVt8W4PJHW9Uq44tw5piD3Tnm+NFLycfFbRh8jJgQhDNUiuMwFUy bwi768RlSVFU4Qeacm0dSHanPScvgGED2hlWr/p8cwjaJwTnTNNn3JDSCku+wgdRLndv holydf0mmNjMfKCgN/8JYa+aSakw8XJtet33+rRBcD3ziNb8P/b9GSc77zVpDKi7nv1Y Qz9g== 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=AUPBtLOAZ/nzsl1gsIigS/M5IZJd5wFUohoDYaOWuRtyannz1g6dyvrBEgVf5KSg12 ttfEVieaN3KzC6nEdsu4Qhv/cCwTh5VxPEC/TFhdsK0qpcKSVL2co7Kz+Pnet+Q3sMix kT435vpiRFb/hZRuGj7SxHlxgtEkgZ5W2pLkZ4oAX/s1ikTey9811UYkdA1Stph7k+8Q mMI7wvQEKs7fXYBwY6BtqeTqyOXKwhsfd9M/rh+yrraY8txRd7pYS05uqDx58B3QIVpJ 6ZftAbF7s8VfMByDozO2qlc1JRkP5nnRjD83+t6K3sIEgYTVamFCBxKnZ6sTHSQ1absp Qs9A== 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 c83-v6si5764099wmd.46.2018.05.14.15.26.47; Mon, 14 May 2018 15:26:48 -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 32AD1689D56; Tue, 15 May 2018 01:26:08 +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 C06B26898B5 for ; Tue, 15 May 2018 01:26:06 +0300 (EEST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 0C8809C34F7 for ; Mon, 14 May 2018 18:26:44 -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 eEybMIXo1GyO; Mon, 14 May 2018 18:26:43 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 8ED759C34F8; Mon, 14 May 2018 18:26:43 -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 xSpFY-B3nvpX; Mon, 14 May 2018 18:26:43 -0400 (EDT) Received: from pkeroulas.media.in.cbcsrc.ca (unknown [192.168.50.171]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 65AAE9C34F7; Mon, 14 May 2018 18:26:43 -0400 (EDT) From: Patrick Keroulas To: ffmpeg-devel@ffmpeg.org Date: Mon, 14 May 2018 18:26:37 -0400 Message-Id: <1526336797-21703-3-git-send-email-patrick.keroulas@savoirfairelinux.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1526336797-21703-1-git-send-email-patrick.keroulas@savoirfairelinux.com> References: <1526336797-21703-1-git-send-email-patrick.keroulas@savoirfairelinux.com> Subject: [FFmpeg-devel] [PATCH v6 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;