From patchwork Wed Aug 3 19:36:33 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: 82 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.67 with SMTP id o64csp858559vsd; Wed, 3 Aug 2016 12:48:10 -0700 (PDT) X-Received: by 10.28.20.77 with SMTP id 74mr27788333wmu.1.1470253690287; Wed, 03 Aug 2016 12:48:10 -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 z1si9612050wjc.124.2016.08.03.12.48.09; Wed, 03 Aug 2016 12:48:10 -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 D486968A280; Wed, 3 Aug 2016 22:47:58 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pa0-f68.google.com (mail-pa0-f68.google.com [209.85.220.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 958D8689D41 for ; Wed, 3 Aug 2016 22:39:45 +0300 (EEST) Received: by mail-pa0-f68.google.com with SMTP id ez1so14511077pab.3 for ; Wed, 03 Aug 2016 12:39:52 -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=+VkcJWD3aIQB0g9/9Ay+EjD/zY66PECCviUUVH0UCAM=; b=CNXtw0T1CTyF30sRaNRaZA/XNU5ToGB1Y/FvaGyJL6BPG6GWaXgQc56QyBIKF+dPvn iGxbsd0X/yqODKeo8Cu5yRv5LS+se/LG4fZ3fb3GkwHqw6a2o34fXrn9BRPDa0MmnIMR FzWwTnyBqjxJxnwfessI0FuFdtvD9SA+7vyBumombKvmDgEdSgWwYAqmPo+fvbgVh6qT SX0RhjsHWdWRjM5CRw6z8fRXaw49t1/HDGPkS/QoDcwbcJIUrlkziXAuGhHbo0bswFpn 9SE6TGhnD5kaOBgA/2poWey6WKGIPx9h4NvOH7mYBCgJzFtWPgwjnbEskzDShYIv80ee nJaw== 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=+VkcJWD3aIQB0g9/9Ay+EjD/zY66PECCviUUVH0UCAM=; b=coR/+t5mzsooiQDKJoaxIIFHZwDx5OP5+gw6lG6EemiWB+ysZkYlYFtNQqXhlMP4wq oX3pJahzWRCC4NkqmXY9bIcdNKxm6eiDFgdeVeDldLj66Mcybbx2skolaMLLOIyZRu3+ eEYA61CVZQGtVX+6D+kgF494YnPF+y/5RHLLcKP4czop3pzUOYa0c8jV/CkLg4a0JGEq /TYKIIOqEQztaP1KgFxHhCpeiqp78r3Fd994+mzNhelnhYqHwtoO0qvbuDgw5mAyjCi8 vc3NtllRUnvdL2CZa2MVQ13DitkdzTwFocb35pgoRWMsOBbVOz5D22wU7Q6sKU/0ZTmR XT4g== X-Gm-Message-State: AEkooutYjl+PXwl/EiF7eYc+wKQEJC8LYn1AmQ8ev3z9zabBck8uMJOh8NWOBXMwI03NhQ== X-Received: by 10.66.72.10 with SMTP id z10mr20915341pau.63.1470253190674; Wed, 03 Aug 2016 12:39:50 -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 o80sm14547226pfa.67.2016.08.03.12.39.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 03 Aug 2016 12:39:49 -0700 (PDT) From: Carlos Fernandez Sanz To: ffmpeg-devel@ffmpeg.org Date: Wed, 3 Aug 2016 12:36:33 -0700 Message-Id: <1470252994-30844-2-git-send-email-carlos@ccextractor.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1470252994-30844-1-git-send-email-carlos@ccextractor.org> References: <1470252994-30844-1-git-send-email-carlos@ccextractor.org> Subject: [FFmpeg-devel] [PATCH 1/2] v3 - SCTE 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Carlos Signed-off-by: carlos --- libavcodec/avcodec.h | 1 + libavcodec/codec_desc.c | 6 ++++++ libavformat/mpegts.c | 51 +++++++++++++++++++++++++++++++++++++++++++------ 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 3b21537..601ee5c 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -630,6 +630,7 @@ enum AVCodecID { /* other specific kind of codecs (generally used for attachments) */ AV_CODEC_ID_FIRST_UNKNOWN = 0x18000, ///< A dummy ID pointing at the start of various fake codecs. AV_CODEC_ID_TTF = 0x18000, + AV_CODEC_ID_SCTE_35, AV_CODEC_ID_BINTEXT = 0x18800, AV_CODEC_ID_XBIN, diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c index dea17c9..5c00be0 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -2950,6 +2950,12 @@ static const AVCodecDescriptor codec_descriptors[] = { .long_name = NULL_IF_CONFIG_SMALL("binary data"), .mime_types= MT("application/octet-stream"), }, + { + .id = AV_CODEC_ID_SCTE_35, + .type = AVMEDIA_TYPE_DATA, + .name = "scte_35", + .long_name = NULL_IF_CONFIG_SMALL("SCTE 35 Message Queue"), + }, /* deprecated codec ids */ }; diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index b31d233..3c2e448 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -57,6 +57,7 @@ enum MpegTSFilterType { MPEGTS_PES, MPEGTS_SECTION, MPEGTS_PCR, + MPEGTS_DATA, }; typedef struct MpegTSFilter MpegTSFilter; @@ -510,6 +511,11 @@ static MpegTSFilter *mpegts_open_pcr_filter(MpegTSContext *ts, unsigned int pid) return mpegts_open_filter(ts, pid, MPEGTS_PCR); } +static MpegTSFilter *mpegts_open_data_filter(MpegTSContext *ts, unsigned int pid) +{ + return mpegts_open_filter(ts, pid, MPEGTS_DATA); +} + static void mpegts_close_filter(MpegTSContext *ts, MpegTSFilter *filter) { int pid; @@ -725,6 +731,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 +884,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; @@ -1975,6 +1994,19 @@ 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 == 0x86 && prog_reg_desc == AV_RL32("CUEI")) { + int idx = ff_find_stream_index(ts->stream, pid); + if (idx >= 0) { + st = ts->stream->streams[idx]; + } else { + st = avformat_new_stream(ts->stream, NULL); + if (!st) + goto out; + st->id = pid; + st->codecpar->codec_type = AVMEDIA_TYPE_DATA; + mpegts_find_stream_type(st, stream_type, SCTE_types); + mpegts_open_data_filter(ts, pid); + } } else if (stream_type != 0x13) { if (ts->pids[pid]) mpegts_close_filter(ts, ts->pids[pid]); // wrongly added sdt filter probably @@ -2317,15 +2349,20 @@ static int handle_packet(MpegTSContext *ts, const uint8_t *packet) } } } - - } else { + } else if (tss->type == MPEGTS_DATA) { + int idx = ff_find_stream_index(ts->stream, pid); + p++; + new_data_packet(p,p_end - p, ts->pkt); + if (idx >= 0) { + ts->pkt->stream_index = idx; + } + ts->stop_parse = 1; + } else if (tss->type == MPEGTS_PES) { int ret; // Note: The position here points actually behind the current packet. - if (tss->type == MPEGTS_PES) { - if ((ret = tss->u.pes_filter.pes_cb(tss, p, p_end - p, is_start, + if ((ret = tss->u.pes_filter.pes_cb(tss, p, p_end - p, is_start, pos - ts->raw_packet_size)) < 0) - return ret; - } + return ret; } return 0; @@ -2730,6 +2767,8 @@ static int mpegts_read_packet(AVFormatContext *s, AVPacket *pkt) ret = 0; break; } + } else if (ts->pids[i] && ts->pids[i]->type == MPEGTS_DATA) { + return ret; } }