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(>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;
}
}
--
2.7.4
___
ffmpeg-devel mailing list