From patchwork Wed Aug 28 15:12:51 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kah Goh X-Patchwork-Id: 14753 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 0F0CE4498F3 for ; Wed, 28 Aug 2019 18:13:58 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DE10168ACE7; Wed, 28 Aug 2019 18:13:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from sonic307-55.consmr.mail.gq1.yahoo.com (sonic307-55.consmr.mail.gq1.yahoo.com [98.137.64.31]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D58CA68AB65 for ; Wed, 28 Aug 2019 18:13:50 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com.au; s=s2048; t=1567005228; bh=OrxlRh970y/1NiLdFaDZCG6NO/+m1uG8LLd08ARN1pA=; h=From:To:Cc:Subject:Date:From:Subject; b=e6361+MTfvb/+xO8ZigUvaecPFsDkmv6SjKMIJqHCLoRlqGHBDLw6VAGnNEv3XAPNK9G1VqPs5gTCCJejL5rC4uMRLI4KhElvUxcO+mNmwHZjI/qAFWEjDjJMt6vI9zr5TEjM8DIy+ir7EQ6mZi0asWHDt7osuuDy7ltNjhbaJOw9BL3A862UQBYNrep7pyYWSRErv4+Y6OIS5UOtNnO6g6mh2/vN7BNNjL6GeuwRVWeU3n/tlct2b0FpdtGbDxcMsdO3Lt6/QPJb4hpYLxCedm4MnCy3If1uAGCcYiBSpIMofqTi2B4R1ATZzlSgZK/Bo1SlvUWEgAG3Sq2JpPm7A== X-YMail-OSG: 4K1BuAMVM1lTXfaiCCNOIB6qznASil6NBZ0gmlyEAph3UkZxILeTVIGp026vZr3 kyRKmiha0AZD2lnihEkOnlIyqcCBbTBUqE8b9WITixHjB8hCz7F7zPnMUgWKQa8E9ZNDeG0hyDHz rTnrdIcoOn8G3OsSZWkZ81bGl1Cfc0wzLAhXljRqElHNDFNtDrTEGc1liRrEuaO0pK5b584QVuXH bW8Ra94l8UECZpkpnvpY_Fk9HoxmUaxW0fqWx5mm9iJkEZhQAdK1nej25oVnb9n74jGo6WRyNsCh gngA48NQVSxXapdDG09d_N.QgbPKOXHN7BbZZnqPRiE1ZJgYZ70b7OEJ0hNko_Y16J7LtRnHAX0w V2R7Ia.foZeWJmy7a.t9NHQGaHBsbkspYQQq_NEEvpGaPQwWy8CmSP_x5dS6JphT7QyA8kcgCGrK dRsEAKvwo2wGDEPJxqraCWi4TZSTe5.N_cfgvQxLcgYyb4Rpqpw9iyPnBn6KPOWUULxlwDT4q94m e3z_4lWOuBiaELiAvT_xxy4U2OAiY0IsK.49VOUuHuNe1Rj8kdUpSQLP6DQUF4ZAzv3MDvmsbXa9 sRaxsCPcq4l5cnFwaf8729PQ0d5TnOtykkCmYVLKo9oAdVaTHyG.JKcreIoSC4cYU2LZ8aL_WRcz ikmmMzODnicPj8pMbo34YXz9gjVp2mIUknwgezJob9EyKZ_zCdWPAct6J72WhIPVLygJ5StR_VyP tPKzoPuFUkdz4Antagii3gnXlAVkBjOgO5x9j5vd5HleDB8tH9SoMSFheBuwxAAh8Ns4sEuXTXmF ReyIKJ.3Knmx2ADZx4DXmrYFyPJBgH487feU.OXneJtkZjA1kMxbSs6IXlUG0q0SWy44c8eJ7s6v I83JKRgWbOFDYO5pVu87zzWe.WyqoJGeZxi4GqYsAwe8WRV1e5m7kHek8yhbISw2Xwo5SaUz3VgF .Jgn8PcsVzDkmwbSeZHOB41aW0Bsc.MlBlghtch5198QXPcStwxLdV.bC7hUiya2nNfXHpEn2Mwu ieZbKYw2pGqHfKI3PTLuq3Z39p8PQC.nfg9MIQ0PjSYPzyqkKnJNyKvO6eTg_yh1AQ0OCO6pTK.Q m5YRAHf6kl5vsQoXZpsqgvYuXN3gEBIJBg_CwRoT6Ji_856y2pb39QwJ.dcs8azj.9ESg83JfBT7 2e8cbps4oe6qD52fjMk0hHF4surdT7s4B0O1KKU1IP3CSK1fVu5V.1Ugqx0Q.5YMX05iMykksdWw _baywp5EI5I2FssIaj52lB6v3hJLZt.n1 Received: from sonic.gate.mail.ne1.yahoo.com by sonic307.consmr.mail.gq1.yahoo.com with HTTP; Wed, 28 Aug 2019 15:13:48 +0000 Received: by smtp410.mail.gq1.yahoo.com (Oath Hermes SMTP Server) with ESMTPA ID 47251d9e93cffc3bed97559b41026f02; Wed, 28 Aug 2019 15:13:43 +0000 (UTC) From: Kah Goh To: ffmpeg-devel@ffmpeg.org Date: Wed, 28 Aug 2019 23:12:51 +0800 Message-Id: <20190828151250.12810-1-villastar@yahoo.com.au> X-Mailer: git-send-email 2.23.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] avformat/rtpdec_rfc4175: support non-zero based line numbers 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: Kah Goh , Jacob Siddall Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" There are differing standards that define different starting line numbers. For example, VSF TR-03 says the line numbers starts at 1, whereas SMPTE 2110-20 says it should start at 0. This change fixes the following issues when the line numbering start at 1: - The first scan line was being incorrectly interpreted as the second scan line. This means the first line in the frame was never being populated. - The last packet for the video frame would be treated as invalid because it would have been copied outside of the frame. Consequently, the packet would never be "finalized" and the next packet triggers a missed RTP marker ("Missed previous RTP marker" would keep being logged). VSF TR-03: http://www.videoservicesforum.org/download/technical_recommendations/VSF_TR-03_2015-11-12.pdf Co-Authored-By: Jacob Siddall Co-Authored-By: Kah Goh Signed-off-by: Kah Goh --- libavformat/rtpdec_rfc4175.c | 41 +++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/libavformat/rtpdec_rfc4175.c b/libavformat/rtpdec_rfc4175.c index e9c62c1389..427d4b31e2 100644 --- a/libavformat/rtpdec_rfc4175.c +++ b/libavformat/rtpdec_rfc4175.c @@ -25,6 +25,7 @@ #include "rtpdec_formats.h" #include "libavutil/avstring.h" #include "libavutil/pixdesc.h" +#include struct PayloadContext { char *sampling; @@ -37,6 +38,12 @@ struct PayloadContext { unsigned int pgroup; /* size of the pixel group in bytes */ unsigned int xinc; + /* The line number of the first line in the frame (usually either 0 or 1). */ + int first_line_number; + + /* This is set to true once the first line number is confirmed. */ + bool first_line_number_known; + uint32_t timestamp; }; @@ -136,6 +143,13 @@ static int rfc4175_finalize_packet(PayloadContext *data, AVPacket *pkt, return ret; } +static int rfc4175_initialize(AVFormatContext *s, int st_index, PayloadContext *data) +{ + data->first_line_number = 0; + data->first_line_number_known = false; + return 0; +} + static int rfc4175_handle_packet(AVFormatContext *ctx, PayloadContext *data, AVStream *st, AVPacket *pkt, uint32_t *timestamp, const uint8_t * buf, int len, @@ -199,6 +213,11 @@ static int rfc4175_handle_packet(AVFormatContext *ctx, PayloadContext *data, cont = headers[4] & 0x80; headers += 6; + if (line == 0) { + data->first_line_number = 0; + data->first_line_number_known = true; + } + if (length % data->pgroup) return AVERROR_INVALIDDATA; @@ -206,9 +225,15 @@ static int rfc4175_handle_packet(AVFormatContext *ctx, PayloadContext *data, length = payload_len; /* prevent ill-formed packets to write after buffer's end */ - copy_offset = (line * data->width + offset) * data->pgroup / data->xinc; - if (copy_offset + length > data->frame_size) - return AVERROR_INVALIDDATA; + copy_offset = ((line - data->first_line_number) * data->width + offset) * data->pgroup / data->xinc; + if (copy_offset + length > data->frame_size) { + if (data->first_line_number_known) + return AVERROR_INVALIDDATA; + + // This would happen if the line numbering is 1 based. We still need to check for the RTP flag + // marker (as per after the while loop). + break; + } dest = data->frame + copy_offset; memcpy(dest, payload, length); @@ -218,6 +243,15 @@ static int rfc4175_handle_packet(AVFormatContext *ctx, PayloadContext *data, } while (cont); if ((flags & RTP_FLAG_MARKER)) { + if (!data->first_line_number_known) { + data->first_line_number = line - data->height + 1; + if (data->first_line_number < 0) { + // This could happen if the frame does not fill up the entire height. + data->first_line_number = 0; + av_log(ctx, AV_LOG_WARNING, "Video frame does not fill entire height"); + } + data->first_line_number_known = true; + } return rfc4175_finalize_packet(data, pkt, st->index); } else if (missed_last_packet) { return 0; @@ -232,5 +266,6 @@ const RTPDynamicProtocolHandler ff_rfc4175_rtp_handler = { .codec_id = AV_CODEC_ID_BITPACKED, .priv_data_size = sizeof(PayloadContext), .parse_sdp_a_line = rfc4175_parse_sdp_line, + .init = rfc4175_initialize, .parse_packet = rfc4175_handle_packet, };