From patchwork Mon Apr 19 16:59:41 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: zheng qian X-Patchwork-Id: 27090 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:5014:0:0:0:0:0 with SMTP id e20csp693776iob; Mon, 19 Apr 2021 10:00:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy1Gv1Be6g+k1o4M7a5V2vnTxrB3FxuuP2uQG5SodzFBi990sZDqYlAs6j9QFRvc/ViL4yi X-Received: by 2002:a17:907:7246:: with SMTP id ds6mr4340832ejc.330.1618851651329; Mon, 19 Apr 2021 10:00:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1618851651; cv=none; d=google.com; s=arc-20160816; b=i4IukKMxm6yVkPFWKzHKQTDJiu4l5AJ2TwJqOzhz7aSzoFJxockpKkhpreFDPXyVZN YWswVLhva15qgWcWfXxlE6t5+DsO/TOwrlwhbXUOANAdm1+frAj0u/Uo7b2aCPp9oiWK 4O+mGjMA4fCoOJvqQtvnLnHKqRfNbOezhXnZXOdSsZ3YSXXp0j9X1Im02wYHjy+g1vSw JGF2AfJQQP9sDPO8wkra53XChVu5PwAGB8QEQVTzbRojyBBFbjzkr+Wj8DBOvitNFtQ4 kuCD88Fx+OpBqXpaj3GbbLwtf899rd3hGhetmTaIppniyeEFYce/Zvsn9nDaUr4B8/zn qRnQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=N0/z0SHZ/JJgxrovK6gnvbKanlijf652Vn65IXIsQL0=; b=N90b/Rs06baNEojshYSnQCj9gpWEZC9joKaaHZRUprxfpY6KSN3JzEieeoAkAJ4d5R utO1hRN6HQV+MEsOGFJKbe8r6BKnDImMbpdG89W315OHporfflBMmzKD0uSmCItAarAB EYjdktp+CkTxd09YncNdFiPPURqadkOG8CisxYEIixRJCT8pGJB4jDz2JNt9d6/ndp6W Gxdy5ZO0AWpIHss12his8fK1KfovwEfh9JkcPcgMzCaBO+FNrj9iXkSl08CMZG153I8R XYoeVZsT+TrrwrWBReeGKkjYsY8/2pUVDUYHoz9jiiMXe1YAQJpsBetPdiHIah9wVyXS v4WA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@xqq-im.20150623.gappssmtp.com header.s=20150623 header.b=DC6OhEc7; 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 l11si6724642edr.343.2021.04.19.10.00.50; Mon, 19 Apr 2021 10:00:51 -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; dkim=neutral (body hash did not verify) header.i=@xqq-im.20150623.gappssmtp.com header.s=20150623 header.b=DC6OhEc7; 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 69A1D689955; Mon, 19 Apr 2021 20:00:47 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f178.google.com (mail-pl1-f178.google.com [209.85.214.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5DBE7680514 for ; Mon, 19 Apr 2021 20:00:40 +0300 (EEST) Received: by mail-pl1-f178.google.com with SMTP id t22so17743364ply.1 for ; Mon, 19 Apr 2021 10:00:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xqq-im.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=TGW2V3WWbagwpIDR9sWbfaAKA8QJUJ3c8zqkbroG/Gc=; b=DC6OhEc7IV+RAGUKbO8c14Dqvpb4mJGScgEdnly2S7z+rMeHxNUMAa7AYWQVCpzjot hFVHKKKo1CW32taIH2B0VjNu6XRR7B+xm99XvhSnLvKXqYkD1+OkJexi1snx82XMJwoB J18OFkXqMHIFCD2taYWQyVtPdBjTcabhVkou4MiKLXt+WaUMHjZJp2ojgurKa3pQopbb TrogmJXycaNtNH46N7l+X5n9Jop6zVSVbsL7sFk4wBV1KDc5GXF5gdSFxRX3KUQEP8pj Yb1/t7igFsbPSDBSRA0MnXsC6COKvI1OQSn7TVfPf9/++nj3pDBBO4s+6WhYm0GEigpg up3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=TGW2V3WWbagwpIDR9sWbfaAKA8QJUJ3c8zqkbroG/Gc=; b=RDJsx0ONOr85nqCCpcjA+I/wqdGoT+Cj/JZtIj/KI0yOPh+HzhXuJQZ1TxNU3ap6XS xHkimJ4GwEeNLN5i/qVyrl5p3sp8RKWth9VUK4Q/9eiTl/im1hU6kBgpJ97OV1kIRD8q arPT69QWoBtnSxlIreI2OQd0Fu91Coj6HQafAI6dzYxIxrS7mxVuaLJRxGY9RuMitnuu ai1ubA6vinfEYUgxop7YdK4D/F8FmHB9WxJtvGZoZtDGol77aG97ogBzaeTWZW97upLI I9KAPMb76WBlVLX4i9Fb7D1R+6XkYrRIgist5y3pX4csuZFdztE83VH78JCZEWyIkTvp UHYg== X-Gm-Message-State: AOAM533c1OpaBbC8kYUt5OpRYNHN5RVBhT9fBo2TW2OCo4X7xWxNq/wd 4aoNUVoEF4O0BxEAgmPF6/8fxXp4tCWwC0sS X-Received: by 2002:a17:902:b592:b029:ec:b451:5805 with SMTP id a18-20020a170902b592b02900ecb4515805mr492688pls.72.1618851638187; Mon, 19 Apr 2021 10:00:38 -0700 (PDT) Received: from zhengqian-xps.lan (ngn-nat1.v4.open.ad.jp. [202.222.12.138]) by smtp.gmail.com with ESMTPSA id s40sm12131808pfw.100.2021.04.19.10.00.35 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 19 Apr 2021 10:00:37 -0700 (PDT) From: zheng qian To: ffmpeg-devel@ffmpeg.org Date: Tue, 20 Apr 2021 01:59:41 +0900 Message-Id: <20210419165941.60248-1-xqq@xqq.im> X-Mailer: git-send-email 2.29.2 In-Reply-To: <09d512fe-a8fe-0f7e-49dd-6ccb9f8907a1@gmail.com> References: <09d512fe-a8fe-0f7e-49dd-6ccb9f8907a1@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat/mpegtsenc: Fix mpegts_write_pes() for private_stream_2 and other types X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: zheng qian Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ZDfskLwx1FIX According to the PES packet definition defined in Table 2-17 of ISO_IEC_13818-1 specification, some fields like PTS/DTS or pes_extension could only appears if the stream_id meets the condition: if (stream_id != 0xBC && // program_stream_map stream_id != 0xBE && // padding_stream stream_id != 0xBF && // private_stream_2 stream_id != 0xF0 && // ECM stream_id != 0xF1 && // EMM stream_id != 0xFF && // program_stream_directory stream_id != 0xF2 && // DSMCC_stream stream_id != 0xF8) // ITU-T Rec. H.222.1 type E stream And the following stream_id types don't have fields like PTS/DTS: else if ( stream_id == program_stream_map || stream_id == private_stream_2 || stream_id == ECM || stream_id == EMM || stream_id == program_stream_directory || stream_id == DSMCC_stream || stream_id == ITU-T Rec. H.222.1 type E stream ) { for (i = 0; i < PES_packet_length; i++) { PES_packet_data_byte } } Current implementation skipped the judgement of stream_id causing some kind of stream like private_stream_2 to be incorrectly written with PTS/DTS field. For example, Japan DTV transmits news and alerts through ARIB superimpose that utilizes private_stream_2 still could not be remuxed correctly for now. This patch fixes the remuxing of private_stream_2 and other stream_id types. Signed-off-by: zheng qian --- libavformat/mpegtsenc.c | 108 ++++++++++++++++++++++------------------ 1 file changed, 60 insertions(+), 48 deletions(-) diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c index f302af84ff..da8fb381e5 100644 --- a/libavformat/mpegtsenc.c +++ b/libavformat/mpegtsenc.c @@ -1445,28 +1445,28 @@ static void mpegts_write_pes(AVFormatContext *s, AVStream *st, is_dvb_teletext = 0; if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { if (st->codecpar->codec_id == AV_CODEC_ID_DIRAC) - *q++ = STREAM_ID_EXTENDED_STREAM_ID; + stream_id = STREAM_ID_EXTENDED_STREAM_ID; else - *q++ = STREAM_ID_VIDEO_STREAM_0; + stream_id = STREAM_ID_VIDEO_STREAM_0; } else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && (st->codecpar->codec_id == AV_CODEC_ID_MP2 || st->codecpar->codec_id == AV_CODEC_ID_MP3 || st->codecpar->codec_id == AV_CODEC_ID_AAC)) { - *q++ = STREAM_ID_AUDIO_STREAM_0; + stream_id = STREAM_ID_AUDIO_STREAM_0; } else if (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && st->codecpar->codec_id == AV_CODEC_ID_AC3 && ts->m2ts_mode) { - *q++ = STREAM_ID_EXTENDED_STREAM_ID; + stream_id = STREAM_ID_EXTENDED_STREAM_ID; } else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA && st->codecpar->codec_id == AV_CODEC_ID_TIMED_ID3) { - *q++ = STREAM_ID_PRIVATE_STREAM_1; + stream_id = STREAM_ID_PRIVATE_STREAM_1; } else if (st->codecpar->codec_type == AVMEDIA_TYPE_DATA) { - *q++ = stream_id != -1 ? stream_id : STREAM_ID_METADATA_STREAM; + stream_id = stream_id != -1 ? stream_id : STREAM_ID_METADATA_STREAM; if (stream_id == STREAM_ID_PRIVATE_STREAM_1) /* asynchronous KLV */ pts = dts = AV_NOPTS_VALUE; } else { - *q++ = STREAM_ID_PRIVATE_STREAM_1; + stream_id = STREAM_ID_PRIVATE_STREAM_1; if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE) { if (st->codecpar->codec_id == AV_CODEC_ID_DVB_SUBTITLE) { is_dvb_subtitle = 1; @@ -1475,6 +1475,7 @@ static void mpegts_write_pes(AVFormatContext *s, AVStream *st, } } } + *q++ = stream_id; header_len = 0; flags = 0; if (pts != AV_NOPTS_VALUE) { @@ -1524,50 +1525,61 @@ static void mpegts_write_pes(AVFormatContext *s, AVStream *st, } *q++ = len >> 8; *q++ = len; - val = 0x80; - /* data alignment indicator is required for subtitle and data streams */ - if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codecpar->codec_type == AVMEDIA_TYPE_DATA) - val |= 0x04; - *q++ = val; - *q++ = flags; - *q++ = header_len; - if (pts != AV_NOPTS_VALUE) { - write_pts(q, flags >> 6, pts); - q += 5; - } - if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) { - write_pts(q, 1, dts); - q += 5; - } - if (pes_extension && st->codecpar->codec_id == AV_CODEC_ID_DIRAC) { - flags = 0x01; /* set PES_extension_flag_2 */ - *q++ = flags; - *q++ = 0x80 | 0x01; /* marker bit + extension length */ - /* Set the stream ID extension flag bit to 0 and - * write the extended stream ID. */ - *q++ = 0x00 | 0x60; - } - /* For Blu-ray AC3 Audio Setting extended flags */ - if (ts->m2ts_mode && - pes_extension && - st->codecpar->codec_id == AV_CODEC_ID_AC3) { - flags = 0x01; /* set PES_extension_flag_2 */ + + if (stream_id != 0xBC && // program_stream_map + stream_id != 0xBE && // padding_stream + stream_id != 0xBF && // private_stream_2 + stream_id != 0xF0 && // ECM + stream_id != 0xF1 && // EMM + stream_id != 0xFF && // program_stream_directory + stream_id != 0xF2 && // DSMCC_stream + stream_id != 0xF8) { // ITU-T Rec. H.222.1 type E stream + + val = 0x80; + /* data alignment indicator is required for subtitle and data streams */ + if (st->codecpar->codec_type == AVMEDIA_TYPE_SUBTITLE || st->codecpar->codec_type == AVMEDIA_TYPE_DATA) + val |= 0x04; + *q++ = val; *q++ = flags; - *q++ = 0x80 | 0x01; /* marker bit + extension length */ - *q++ = 0x00 | 0x71; /* for AC3 Audio (specifically on blue-rays) */ - } + *q++ = header_len; + if (pts != AV_NOPTS_VALUE) { + write_pts(q, flags >> 6, pts); + q += 5; + } + if (dts != AV_NOPTS_VALUE && pts != AV_NOPTS_VALUE && dts != pts) { + write_pts(q, 1, dts); + q += 5; + } + if (pes_extension && st->codecpar->codec_id == AV_CODEC_ID_DIRAC) { + flags = 0x01; /* set PES_extension_flag_2 */ + *q++ = flags; + *q++ = 0x80 | 0x01; /* marker bit + extension length */ + /* Set the stream ID extension flag bit to 0 and + * write the extended stream ID. */ + *q++ = 0x00 | 0x60; + } + /* For Blu-ray AC3 Audio Setting extended flags */ + if (ts->m2ts_mode && + pes_extension && + st->codecpar->codec_id == AV_CODEC_ID_AC3) { + flags = 0x01; /* set PES_extension_flag_2 */ + *q++ = flags; + *q++ = 0x80 | 0x01; /* marker bit + extension length */ + *q++ = 0x00 | 0x71; /* for AC3 Audio (specifically on blue-rays) */ + } - if (is_dvb_subtitle) { - /* First two fields of DVB subtitles PES data: - * data_identifier: for DVB subtitle streams shall be coded with the value 0x20 - * subtitle_stream_id: for DVB subtitle stream shall be identified by the value 0x00 */ - *q++ = 0x20; - *q++ = 0x00; - } - if (is_dvb_teletext) { - memset(q, 0xff, pes_header_stuffing_bytes); - q += pes_header_stuffing_bytes; + if (is_dvb_subtitle) { + /* First two fields of DVB subtitles PES data: + * data_identifier: for DVB subtitle streams shall be coded with the value 0x20 + * subtitle_stream_id: for DVB subtitle stream shall be identified by the value 0x00 */ + *q++ = 0x20; + *q++ = 0x00; + } + if (is_dvb_teletext) { + memset(q, 0xff, pes_header_stuffing_bytes); + q += pes_header_stuffing_bytes; + } } is_start = 0; }