From patchwork Mon May 14 19:29:10 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Keroulas X-Patchwork-Id: 8960 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp511936jad; Mon, 14 May 2018 12:29:36 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqP3viHua2yg3JJvVOhX0Z28PHtnu68gPGtLR8u+SMLISoBbEw2XdM2LgwndTrprE17w4Aw X-Received: by 2002:adf:8f72:: with SMTP id p105-v6mr8510768wrb.181.1526326176825; Mon, 14 May 2018 12:29:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526326176; cv=none; d=google.com; s=arc-20160816; b=y+vSomqgqOrCQplJJnt5myfEBnibtSeFH3T3cwXfHc1j8hOyozUY4DPm3nUAXqgOx8 lL78Ii3Dosw/LnW9lGn+Sgei0szB0ZuXr13hFODOFpxHFOT9wEOp2PjVNb0LR3x255Aa 169YiBtyZU9tw1Hji6bJ3MQzd0I162c2qiXBkdjTnxcALlJaJFmBZGPfm/5g13LCntAO pt3L/7BsIKmeDfEaPEpjHz7ILuQNrIq3WXIbM4zSJ7F3Np3Fd34G5ugg05r98sLNdlEo DRM0bfZieQRzLi7GtXLIUZV3aE+KZ50M42ASJm8H0uShIwjR+1bHY4GtTf/0XjM5ou4S EWtA== 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=FtMbck9l3k0Z/X7Lrd/npZudlEyrQAdcNrv0rxdd/r9bD8uWDhETGad4ggjWQZQez4 syELYbLzCuq5cupuBEaOIOMCZ2MGiQ9q8OnJ5YXv2ZW09FZCEYhjxt57O5h8o7Ge49jZ +2EwS4fFTRFdeH9Uw7H9HBoPm5rt24qffDVus1ftYL7SKh0+7M5Ajc8cV7xGGPXtRM2H LAf9elUVL4OtrtzmxqdKaXvNKHvluor6IGrXbFB9xZCB+hZwGGuGQ/eq3jd0bmTPUud6 XxH3VUH1HWkZnXTYawIxXu02FTerkZWWD5Zr6+tfRjTbapf7LpFXKgTTNhjYrUVgypvJ d8Vg== 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 y2-v6si8622116wra.252.2018.05.14.12.29.36; Mon, 14 May 2018 12:29:36 -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 29F3F688312; Mon, 14 May 2018 22:28:57 +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 D41F76802D7 for ; Mon, 14 May 2018 22:28:50 +0300 (EEST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 21DDB9C1D15 for ; Mon, 14 May 2018 15:29:28 -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 tCmLk9mL5KcY; Mon, 14 May 2018 15:29:27 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id A5E509C3472; Mon, 14 May 2018 15:29:27 -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 Yf-2z0qhpijl; Mon, 14 May 2018 15:29:27 -0400 (EDT) Received: from pkeroulas.media.in.cbcsrc.ca (unknown [192.168.50.171]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 7EC079C1D15; Mon, 14 May 2018 15:29:27 -0400 (EDT) From: Patrick Keroulas To: ffmpeg-devel@ffmpeg.org Date: Mon, 14 May 2018 15:29:10 -0400 Message-Id: <1526326150-12360-2-git-send-email-patrick.keroulas@savoirfairelinux.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1526326150-12360-1-git-send-email-patrick.keroulas@savoirfairelinux.com> References: <1526326150-12360-1-git-send-email-patrick.keroulas@savoirfairelinux.com> Subject: [FFmpeg-devel] [PATCH v5 2/2] 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;