From patchwork Fri Apr 20 19:02:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Keroulas X-Patchwork-Id: 8539 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:155:0:0:0:0:0 with SMTP id c82-v6csp1014822jad; Fri, 20 Apr 2018 12:03:16 -0700 (PDT) X-Google-Smtp-Source: AIpwx483YWzbrtKpQL7migcJ1oTxXoVi0DVZTUrL4oqRSNZeGb5Vlv0INeNDyIpEidXxslzbtnBF X-Received: by 2002:adf:8062:: with SMTP id 89-v6mr9278719wrk.141.1524250996188; Fri, 20 Apr 2018 12:03:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524250996; cv=none; d=google.com; s=arc-20160816; b=rmaW0E1+PxeB9rWiotlT7/rnPEHBproh5OebKBhuWCpQ7zR0JH6F65e/iCnbjlMdVy Z0Aa1rN6qABIVeV9DYQ2r6u20LMBhDvT3XbwUvlWJKht+tHet2SsOoHMqjwaHtIGod/J ioW7goi/qIYu/L6hjaRlOr2SXUG+MrpVQ8mtjfmjFZpmD4lKh8lJsFw8pcLB65O2CB7o VXE4oaIRKPzyrxIfko4/H52wQBjdPKlBLjU6wMFnIvDbE3nxej+twDg7JOis+qRUuS3W 1aV1x8WzEgWZAYou0LIpKHnjcZR4S+mxOShVN3s+SZGp2/CufiZZD3ubC6O0MC05MMmb qjPg== 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=wz/JMbmPuNwHqqIodDUdp/zuPlQn+/4hcI95yW392Nw=; b=e554ZWDHy+KZayO2mwX8B/D24vbO8UhmcI7Q/gfJWznGJ+6copH4tLUtBVWhsy8ZWd vUIDGLPuSckIc8Nq/gdZ7Rzj6zcYK/y8HWi10R3N+geWSBoJAqRh7EyZp79kkxxP7SUG 7Yrrrf7r2YKhVYRbbprIstcJapbF1wpC2xDdmpDPTUjkZEKq73n7NmPBDocTBLMKYNs3 PHH34jvAJ3cIStEo2wy5CkVl/jfVFhmh3LOU8WX/ctVAOj9rcFxe4KxqTBKTJwigvT9G itjkBo2nis2rVumbNQfpY6eYXPumPXHzOdF824Ftiml7h+TI9NwkHLAGJvs7Cwx4mEpF ST0w== 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 p5si1551422wmf.160.2018.04.20.12.03.15; Fri, 20 Apr 2018 12:03:16 -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 CA808689F57; Fri, 20 Apr 2018 22:02:29 +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 79651689CD8 for ; Fri, 20 Apr 2018 22:02:22 +0300 (EEST) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id DB2819C1AA6 for ; Fri, 20 Apr 2018 15:02:49 -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 0j8ioqiIYDTd; Fri, 20 Apr 2018 15:02:48 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by mail.savoirfairelinux.com (Postfix) with ESMTP id 515379C19CF; Fri, 20 Apr 2018 15:02:48 -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 86zrBMOnSUDM; Fri, 20 Apr 2018 15:02:48 -0400 (EDT) Received: from pkeroulas.media.in.cbcsrc.ca (unknown [192.168.50.171]) by mail.savoirfairelinux.com (Postfix) with ESMTPSA id 324969C1AA6; Fri, 20 Apr 2018 15:02:48 -0400 (EDT) From: Patrick Keroulas To: ffmpeg-devel@ffmpeg.org Date: Fri, 20 Apr 2018 15:02:41 -0400 Message-Id: <1524250961-16337-3-git-send-email-patrick.keroulas@savoirfairelinux.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1524250961-16337-1-git-send-email-patrick.keroulas@savoirfairelinux.com> References: <1524250961-16337-1-git-send-email-patrick.keroulas@savoirfairelinux.com> Subject: [FFmpeg-devel] [PATCH v2 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 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 --- libavformat/rtpdec_rfc4175.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/libavformat/rtpdec_rfc4175.c b/libavformat/rtpdec_rfc4175.c index e9c62c1..55a36eb 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,11 @@ 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 */ + pkt->flags |= data->field ? 0 : AV_PKT_FLAG_TOP_FIELD; data->frame = NULL; + data->field = 0; return ret; } @@ -141,7 +157,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 +210,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;