From patchwork Tue Sep 27 20:38:27 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Carlos Fernandez Sanz X-Patchwork-Id: 755 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.66 with SMTP id o63csp63124vsd; Tue, 27 Sep 2016 13:41:21 -0700 (PDT) X-Received: by 10.195.3.4 with SMTP id bs4mr29639115wjd.193.1475008880919; Tue, 27 Sep 2016 13:41:20 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 11si15700031wmn.108.2016.09.27.13.41.17; Tue, 27 Sep 2016 13:41:20 -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=@nisupu-com.20150623.gappssmtp.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 4FD4F689F11; Tue, 27 Sep 2016 23:40:49 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pf0-f196.google.com (mail-pf0-f196.google.com [209.85.192.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F2385689BCB for ; Tue, 27 Sep 2016 23:40:42 +0300 (EEST) Received: by mail-pf0-f196.google.com with SMTP id 21so1177663pfy.1 for ; Tue, 27 Sep 2016 13:40:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nisupu-com.20150623.gappssmtp.com; s=20150623; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=/MALscIyq/nRUXowKX6VzJvu7hWL1JXozwKgLHK1lEM=; b=VLWRUOrLZ4XCm8CnMOPUas2nbC+bPzdVTAotJTJG8sj6ZnXCog79qYaZdkNFUJITnX 3F7JPMOYjMGkvJnobjtsMdpS+zbRYDw7GTXVfkXmAZLw3tdf12xs1W5uzKutzQsTSy/a i5K/Z7rsM80Bj4zCCk0i4bOOLgnevcSyaKg9QxjxaZbJPDrXBzebjYpy5Kp8VcflvRRc rLovokU/SJYlMdkChSlnob/ZRYFIiHaR4u0hL4lGEZy81k3rrkFwBqxO8WhdHQVhRQJo l7AWI3Z7K75nt4Sdd6+/nWOZDNg49w1mVmwZBb+0kQWSWv/lT20qWjtpoTMOTZj5xKx5 2C0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=/MALscIyq/nRUXowKX6VzJvu7hWL1JXozwKgLHK1lEM=; b=MUI8rhpENHq09G3YbuhiDm2BZB8JVm0iGK322g+9zJJPGnv2C5ipiOIA1TvpzcBzmr UPGnX5YTI9lY/mfLFCEkWaJKLG7uQhV5yBkBNM701yO8JCOTxBV81Oa/vqFO6s2iSoLN BlRrlilLa33Tv2LCcfbePXbYW4+LicH8zoRokBnPfZHPe5Lly5uJ+mO+fOwZhU3HVS0Y zHf5gJcm/MV0UZbyfdIs+fmszaXGdYgUn45TdgiHqI0eFtKDu85u9+KPYQ2a4PpU321F nM7+sypHgn/bITPyHYGDgCTFJ/9q3XEJyFAEQpWQqOKqn9HhmftLgvW5WNZQuFYpribM yM2Q== X-Gm-Message-State: AE9vXwMsnBBFcGZ30hZZbK1rdwEDbYLeUm6ymuOm4fCMZcis3hq7W5iTkHTKNWX8MHxuaA== X-Received: by 10.98.48.4 with SMTP id w4mr50631887pfw.86.1475008853426; Tue, 27 Sep 2016 13:40:53 -0700 (PDT) Received: from carlos-linux-dev.monkeybrains.net (162-245-20-150.PUBLIC.monkeybrains.net. [162.245.20.150]) by smtp.gmail.com with ESMTPSA id xs10sm6966182pab.13.2016.09.27.13.40.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 27 Sep 2016 13:40:52 -0700 (PDT) From: Carlos Fernandez Sanz To: ffmpeg-devel@ffmpeg.org Date: Tue, 27 Sep 2016 13:38:27 -0700 Message-Id: <1475008709-12726-3-git-send-email-carlos@ccextractor.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1475008709-12726-1-git-send-email-carlos@ccextractor.org> References: <1475008709-12726-1-git-send-email-carlos@ccextractor.org> Subject: [FFmpeg-devel] [PATCH 2/4] V11 - SCTE-35 extraction from mpegts 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: Carlos Fernandez MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Carlos Fernandez Signed-off-by: Carlos Fernandez --- libavformat/mpegts.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index b31d233..d816450 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -725,6 +725,12 @@ static const StreamType HDMV_types[] = { { 0 }, }; +/* SCTE types */ +static const StreamType SCTE_types[] = { + { 0x86, AVMEDIA_TYPE_DATA, AV_CODEC_ID_SCTE_35 }, + { 0 }, +}; + /* ATSC ? */ static const StreamType MISC_types[] = { { 0x81, AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_AC3 }, @@ -872,6 +878,13 @@ static void reset_pes_packet_state(PESContext *pes) av_buffer_unref(&pes->buffer); } +static void new_data_packet(const uint8_t *buffer, int len, AVPacket *pkt) +{ + av_init_packet(pkt); + pkt->data = buffer; + pkt->size = len; +} + static int new_pes_packet(PESContext *pes, AVPacket *pkt) { char *sd; @@ -1590,6 +1603,27 @@ static void m4sl_cb(MpegTSFilter *filter, const uint8_t *section, av_free(mp4_descr[i].dec_config_descr); } +static void scte_data_cb(MpegTSFilter *filter, const uint8_t *section, + int section_len) +{ + AVProgram *prg = NULL; + MpegTSContext *ts = filter->u.section_filter.opaque; + + int idx = ff_find_stream_index(ts->stream, filter->pid); + new_data_packet(section, section_len, ts->pkt); + if (idx >= 0) { + ts->pkt->stream_index = idx; + } + prg = av_find_program_from_stream(ts->stream, NULL, idx); + if (prg && prg->pcr_pid != -1 && prg->discard != AVDISCARD_ALL) { + MpegTSFilter *f = ts->pids[prg->pcr_pid]; + if (f) + ts->pkt->pts = ts->pkt->dts = f->last_pcr/300; + } + ts->stop_parse = 1; + +} + static const uint8_t opus_coupled_stream_cnt[9] = { 1, 0, 1, 1, 2, 2, 2, 3, 3 }; @@ -1868,6 +1902,12 @@ int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type return 0; } +static int is_pes_stream(int stream_type, uint32_t prog_reg_desc) +{ + return !(stream_type == 0x13 || + (stream_type == 0x86 && prog_reg_desc == AV_RL32("CUEI")) ); +} + static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) { MpegTSContext *ts = filter->u.section_filter.opaque; @@ -1975,7 +2015,8 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len pes->st->id = pes->pid; } st = pes->st; - } else if (stream_type != 0x13) { + + } else if (is_pes_stream(stream_type, prog_reg_desc)) { if (ts->pids[pid]) mpegts_close_filter(ts, ts->pids[pid]); // wrongly added sdt filter probably pes = add_pes_stream(ts, pid, pcr_pid); @@ -1995,6 +2036,10 @@ static void pmt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len goto out; st->id = pid; st->codecpar->codec_type = AVMEDIA_TYPE_DATA; + if (stream_type == 0x86 && prog_reg_desc == AV_RL32("CUEI")) { + mpegts_find_stream_type(st, stream_type, SCTE_types); + mpegts_open_section_filter(ts, pid, scte_data_cb, ts, 1); + } } } @@ -2317,7 +2362,6 @@ static int handle_packet(MpegTSContext *ts, const uint8_t *packet) } } } - } else { int ret; // Note: The position here points actually behind the current packet.