From patchwork Wed Aug 28 14:33:10 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kah Goh X-Patchwork-Id: 14750 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 DCE944488B0 for ; Wed, 28 Aug 2019 17:33:22 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id ADEA368AE65; Wed, 28 Aug 2019 17:33:22 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from sonic315-54.consmr.mail.gq1.yahoo.com (sonic315-54.consmr.mail.gq1.yahoo.com [98.137.65.30]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 05A3068AE42 for ; Wed, 28 Aug 2019 17:33:21 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com.au; s=s2048; t=1567002799; bh=JxI3ZEpWEifT+sZIa9b0exXSsLiUUL4bUCE5DEQ8OyU=; h=From:To:Cc:Subject:Date:From:Subject; b=RnZqhZZ4JmfR4TE/o98MGXmGnAih5VFK2FtJFAzqZb6fSt97dNobNTFoSdpfE9C/N8cmvwDUqbbOspK2R0m1pO8fXqT4m17YuUH5aTzzdIvUCnkXnHcSQByt0D+HEl6iVUlmWn+Z5k9Gpb8BgP+0D4iBZI1OkF572XobONNFiOdq7GtMS41CIX/NqF12ANapOe4m/6nk7CUJfKZClhmZJ8j7u62En91lYG4ZGwFIfoclE9tm39IdWnKBMFIc2gjGknH7H4Ay5j5QJuLwWQSIJef6p2gyEFZETgqsrrwTn44y3q3l1X+36/NI1QwsdbIISw//zVcBCFzkUnGxs+Q+Kw== X-YMail-OSG: Xc1Xr10VM1lkNkfEGxP1_rNQtLLFiAixXH3I_yC9j9N.PXtSOiq_VF_PzBIbJKa hGaqy26zgrOr..Nr8L_dwYLkYYX4Gk4UCW3B6Uo3SH3XhtFWiOXbXgVqUEQC4ynwggjoAkyOvh0a cozKsE0JnWwiuPpnf7.qigSX75VIhuYP7no08o2F8Mnpl6V7QsTYYHaZOG8nTeOK5MkGLbeaN43b 4uX6wG7eMhGUK2rOlVtSYLyrLWa6XPotTDcfmNqGI8az4T55kG2hTB1PO8buwOAkqupHbpDlwQEc wDov68rvyoKcxXxL3JKFO1dYU2VvFm0gwmi8KpfHBtUgEwNRZ_7t_PE394MwT1PdLHCUNm0goQzp .eUA7haE1LZqf4dKAtJq7RdIjtyQC3VNH3otLlPgle0bcuTZP_6qJgGToT0W1ig0rhaZv7rKuFg2 m3ODZ0a2NI3Vy_Znr5KIUoQ.mf9TT6ZAg0sus.kYI6QS.seYZCfswj9aYy4A06SBCXuOEOLdp32T nK6uQOq2D0Je65qBTVq3052OTLLCi8WbN1x._BqlkB58QpARSDwomsFFRspdKhiErvvLId5KQAB3 hTyGObszx0fns0wP9L8IKUz8N7_EZ6jydjO50QBhyCBzzbjXT1l18WQ8AjNhnNc0ml3aS8PZ67Fv 4eOokahvMJYszO6Ig.w3_EpqZG1dHolJkvXO.cit4iWTeSw.MVIrj8rB8Vi1OED.fNCxN3j0qAeZ nVB5zil9p9y.3iXHVqIWra4Bk0Z0m1kCv3L.P_PuOGZUIqN2WlIiNvlh72BDCPdbjUD50GJ0x.QO ufUhMUBrStb.fccBNY36wEzMqBB1A5qIpDjQC09AuD2as10RbLPd3BWbMZB5DEhtYc4RcEskFFKZ U0TALZONwR6USmQhozp91B83swX3NBsm266dV2hputqvcbjoV9za5JxiEbXjjZVWQCNBP5Wnl.0Y zDFx26ztjbVxao9vqyk4c2kXZYZfG9zO.sgZQuJf6fSxzmTQYCso_YeIjSvRsp4RhJWtdv.a9nYp WELmP77qjhjCBvJo1PZ2naJortGQqzRY352lgxeJNKQI65KJ3xgcQGz_M5ONgI9L4xk0YxgGhlNR LIc4sbYul3PxJi2Vg0SmoioJWT3KOW_c4rkYxOzMzwvJnl12l62lXbi2vqlkHABtDTKEZTbd2Y7k vlJoPXp9bqDvI1KEf9MmEg62Q8wMnuupoB3KI5_gPuzMZTW60pL0fV8VYby61VxLMBSTJwNUeL6H 8xlBVMmndRHmrSLHOTDgN87Z5 Received: from sonic.gate.mail.ne1.yahoo.com by sonic315.consmr.mail.gq1.yahoo.com with HTTP; Wed, 28 Aug 2019 14:33:19 +0000 Received: by smtp418.mail.gq1.yahoo.com (Oath Hermes SMTP Server) with ESMTPA ID ebdb74ebc437289aaa2b2ee00cef72fc; Wed, 28 Aug 2019 14:33:15 +0000 (UTC) From: Kah Goh To: ffmpeg-devel@ffmpeg.org Date: Wed, 28 Aug 2019 22:33:10 +0800 Message-Id: <20190828143310.30558-1-villastar@yahoo.com.au> X-Mailer: git-send-email 2.23.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] 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. 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 --- 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, };