On December 18, 2014 4:08:56 PM IST, Michael Niedermayer <michae...@gmx.at> wrote: >On Wed, Dec 17, 2014 at 11:53:10PM +0530, Anshul wrote: >> Hi >> >> I was doing development of scte-35 message cue in ffmpeg. >> >> I have attached a draft patch. >> >> I would like to have some comments of this community. >> -Anshul > >> libavcodec/Makefile | 2 ++ >> libavcodec/allcodecs.c | 2 ++ >> libavcodec/avcodec.h | 1 + >> libavcodec/codec_desc.c | 6 ++++++ >> libavformat/mpegts.c | 40 >+++++++++++++++++++++++++++++++++------- >> 5 files changed, 44 insertions(+), 7 deletions(-) >> 4b584484a54a78c130c4bbaa48c38551b3ca75fb >0001-trying-muxing-demuxing-of-scte_35-message-cue.patch >> From 2ff4edfdeae131df72ea19005eb6ad85d5332f7c Mon Sep 17 00:00:00 >2001 >> From: Anshul Maheshwari <anshul.ffm...@gmail.com> >> Date: Wed, 17 Dec 2014 22:13:10 +0530 >> Subject: [PATCH] trying muxing demuxing of scte_35 message cue >> >> --- >> libavcodec/Makefile | 2 ++ >> libavcodec/allcodecs.c | 2 ++ >> libavcodec/avcodec.h | 1 + >> libavcodec/codec_desc.c | 6 ++++++ >> libavformat/mpegts.c | 40 >+++++++++++++++++++++++++++++++++------- >> 5 files changed, 44 insertions(+), 7 deletions(-) >> >> diff --git a/libavcodec/Makefile b/libavcodec/Makefile >> index b35a796..9d2a49f 100644 >> --- a/libavcodec/Makefile >> +++ b/libavcodec/Makefile >> @@ -408,6 +408,7 @@ OBJS-$(CONFIG_SAMI_DECODER) += >samidec.o ass.o >> OBJS-$(CONFIG_S302M_DECODER) += s302m.o >> OBJS-$(CONFIG_S302M_ENCODER) += s302menc.o >> OBJS-$(CONFIG_SANM_DECODER) += sanm.o >> +OBJS-$(CONFIG_SCTE_35_DECODER) += scte_35.o > >this patch doesnt contain a scte_35.c >did you forget git add ? > >[...]
I have attached another patch, still its draft. I do want some opinion about the approach of this development. to use this patch, one can pass below command ./ffmpeg -loglevel debug -i ~/test_videos/mpegwithscte35.ts -dcodec cue_xml -map 0:0 -f rawvideo some.raw There still some issue with this patch, like I have disabled estimate timing of all stream since data stream does not have similar timing, i will add condition there. FFmpeg hangs after running command, it might be because of EOF not handled properly, looking at the issue. My vision for this patch is that we can add custom advertisement if stream have scte-cue. This patch might also help end-user to remove advertisements automatically. for broadcaster it will help to show advertisement in local language. or for local product. just now I am very far away from my goal but will not always be. This patch have all files which I have developed. -Anshul
>From 2ff4edfdeae131df72ea19005eb6ad85d5332f7c Mon Sep 17 00:00:00 2001 From: Anshul Maheshwari <anshul.ffm...@gmail.com> Date: Wed, 17 Dec 2014 22:13:10 +0530 Subject: [PATCH] trying muxing demuxing of scte_35 message cue --- libavcodec/Makefile | 2 ++ libavcodec/allcodecs.c | 2 ++ libavcodec/avcodec.h | 1 + libavcodec/codec_desc.c | 6 ++++++ libavformat/mpegts.c | 40 +++++++++++++++++++++++++++++++++------- 5 files changed, 44 insertions(+), 7 deletions(-) diff --git a/libavcodec/Makefile b/libavcodec/Makefile index b35a796..9d2a49f 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -408,6 +408,7 @@ OBJS-$(CONFIG_SAMI_DECODER) += samidec.o ass.o OBJS-$(CONFIG_S302M_DECODER) += s302m.o OBJS-$(CONFIG_S302M_ENCODER) += s302menc.o OBJS-$(CONFIG_SANM_DECODER) += sanm.o +OBJS-$(CONFIG_SCTE_35_DECODER) += scte_35.o OBJS-$(CONFIG_SGI_DECODER) += sgidec.o OBJS-$(CONFIG_SGI_ENCODER) += sgienc.o rle.o OBJS-$(CONFIG_SGIRLE_DECODER) += sgirledec.o @@ -807,6 +808,7 @@ OBJS-$(CONFIG_MPEGVIDEO_PARSER) += mpegvideo_parser.o \ OBJS-$(CONFIG_OPUS_PARSER) += opus_parser.o opus.o vorbis_data.o OBJS-$(CONFIG_PNG_PARSER) += png_parser.o OBJS-$(CONFIG_PNM_PARSER) += pnm_parser.o pnm.o +OBJS-$(CONFIG_SCTE_35_PARSER) += scte_35_parser.o OBJS-$(CONFIG_RV30_PARSER) += rv34_parser.o OBJS-$(CONFIG_RV40_PARSER) += rv34_parser.o OBJS-$(CONFIG_TAK_PARSER) += tak_parser.o tak.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 36bbfed..7484ab1 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -535,6 +535,7 @@ void avcodec_register_all(void) REGISTER_ENCODER(LIBAACPLUS, libaacplus); /* text */ + REGISTER_DECODER(SCTE_35, scte_35) REGISTER_DECODER(BINTEXT, bintext); REGISTER_DECODER(XBIN, xbin); REGISTER_DECODER(IDF, idf); @@ -570,6 +571,7 @@ void avcodec_register_all(void) REGISTER_PARSER(PNM, pnm); REGISTER_PARSER(RV30, rv30); REGISTER_PARSER(RV40, rv40); + REGISTER_PARSER(SCTE_35, scte_35); REGISTER_PARSER(TAK, tak); REGISTER_PARSER(VC1, vc1); REGISTER_PARSER(VORBIS, vorbis); diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index eac3fc7..84b9875 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -522,6 +522,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 = MKBETAG('C','U','E','I'), AV_CODEC_ID_BINTEXT = MKBETAG('B','T','X','T'), AV_CODEC_ID_XBIN = MKBETAG('X','B','I','N'), AV_CODEC_ID_IDF = MKBETAG( 0 ,'I','D','F'), diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c index eeb4505..a98c1c4 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -2731,6 +2731,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 c01f954..56105a6 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; @@ -488,6 +489,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; @@ -666,6 +672,7 @@ static const StreamType ISO_types[] = { { 0x1b, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_H264 }, { 0x24, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_HEVC }, { 0x42, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_CAVS }, + { 0x86, AVMEDIA_TYPE_DATA, AV_CODEC_ID_SCTE_35 }, { 0xd1, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_DIRAC }, { 0xea, AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1 }, { 0 }, @@ -813,7 +820,12 @@ static void reset_pes_packet_state(PESContext *pes) pes->flags = 0; 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 void new_pes_packet(PESContext *pes, AVPacket *pkt) { av_init_packet(pkt); @@ -1871,7 +1883,20 @@ 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 (stream_type == 0x86 ) { + 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->codec->codec_type = AVMEDIA_TYPE_DATA; + mpegts_find_stream_type(st, stream_type, ISO_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 pes = add_pes_stream(ts, pid, pcr_pid); @@ -2202,14 +2227,15 @@ static int handle_packet(MpegTSContext *ts, const uint8_t *packet) } } - } else { + } else if (tss->type == MPEGTS_DATA) { + new_data_packet(p,p_end - p, ts->pkt); + 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; -- 1.8.1.4
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel