[FFmpeg-devel] [PATCH 2/4] V12 - SCTE-35 extraction from mpegts

Marton Balint cus at passwd.hu
Sat Oct 1 20:50:01 EEST 2016


On Sat, 1 Oct 2016, Carlos Fernandez Sanz wrote:

> From: Carlos Fernandez <carlos at ccextractor.org>
>
> Signed-off-by: Carlos Fernandez <carlos at ccextractor.org>
> ---
> libavformat/mpegts.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 47 insertions(+), 1 deletion(-)
>
> diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
> index b31d233..c13d6d8 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,28 @@ 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);
> +    if (idx < 0)
> +        return;
> +
> +    new_data_packet(section, section_len, ts->pkt);
> +    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 && f->last_pcr != -1)
> +            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 +1903,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 +2016,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) {
> +
Empty line.

> +        } 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 +2037,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);
> +                }
>             }
>         }
> 
> --

Otherwise LGTM, thanks.

Regards,
Marton


More information about the ffmpeg-devel mailing list