Re: [FFmpeg-devel] [PATCH] DVB EPG decoder
On Sat, Sep 7, 2019 at 11:39 AM Marton Balint wrote: > > > On Wed, 4 Sep 2019, Anthony Delannoy wrote: > > > Hi > > > > I'm still interested to have those three commits merged (update in > attachments). > > Ok, below are some more comments. > > > > > But I'd like to see data decoder in the future to use more easily > > EPG/NIT/BAT etc tables. > > Will it be possible? With modifications if it needs to be? > > I don't see how, as it does not fit into the concept of the libav* > libraries. I feel this belongs to a separate library. > > > From 335b0bf377c1e5cfc5207561adc9621b113759b0 Mon Sep 17 00:00:00 2001 > > From: Anthony Delannoy > > Date: Wed, 21 Aug 2019 11:46:56 +0200 > > Subject: [PATCH 3/3] lavf/mpegts: EPG extraction from mpegts > > > > --- > > libavformat/mpegts.c | 71 ++-- > > 1 file changed, 69 insertions(+), 2 deletions(-) > > > > diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c > > index 0415ceea02..9bb6b6add8 100644 > > --- a/libavformat/mpegts.c > > +++ b/libavformat/mpegts.c > > @@ -168,6 +168,8 @@ struct MpegTSContext { > > /** filters for various streams specified by PMT + for the PAT and > PMT */ > > MpegTSFilter *pids[NB_PID_MAX]; > > int current_pid; > > + > > +AVStream *epg_stream; > > }; > > > > #define MPEGTS_OPTIONS \ > > @@ -2498,13 +2500,68 @@ static void pat_cb(MpegTSFilter *filter, const > uint8_t *section, int section_len > > } > > } > > > > +static void eit_cb(MpegTSFilter *filter, const uint8_t *section, int > section_len) > > +{ > > +MpegTSContext *ts = filter->u.section_filter.opaque; > > +const uint8_t *p, *p_end; > > +SectionHeader h1, *h = > > + > > +/* > > + * Sometimes we receive EPG packets but SDT table do not have > > + * eit_pres_following or eit_sched turned on, so we open EPG > > + * stream directly here. > > + */ > > +if (!ts->epg_stream) { > > +ts->epg_stream = avformat_new_stream(ts->stream, NULL); > > +if (!ts->epg_stream) > > +return; > > +ts->epg_stream->id = EIT_PID; > > +ts->epg_stream->codecpar->codec_type = AVMEDIA_TYPE_DATA; > > +ts->epg_stream->codecpar->codec_id = AV_CODEC_ID_EPG; > > +} > > + > > +if (ts->epg_stream->discard == AVDISCARD_ALL) > > +return; > > + > > +p_end = section + section_len - 4; > > +p = section; > > + > > +if (parse_section_header(h, , p_end) < 0) > > +return; > > +if (h->tid < EIT_TID || h->tid > OEITS_END_TID) > > +return; > > + > > +av_log(ts->stream, AV_LOG_TRACE, "EIT: tid received = %.02x\n", > h->tid); > > + > > +/** > > + * Service_id 0x is reserved, it indicates that the current EIT > table > > + * is scrambled. > > + */ > > +if (h->id == 0x) { > > +av_log(ts->stream, AV_LOG_WARNING, "Scrambled EIT table > received.\n"); > > +return; > > +} > > In case of a scrambled EIT (which I have never seen myself in the wild) > you'd > print this at every packet. You should either remove the warning, or check > if > this is the first time (e.g. by checking if the EPG stream was just > created). > I have a sample if anyone is interested. AFAIK it is only used by HD BBC broadcasts in the UK. https://tmm1.s3.amazonaws.com/dvb-eit/uk-eit-hd.ts https://stackoverflow.com/questions/37765956/linux-dvb-v5-library-example-code-for-eit-grabbing#comment66609009_37765956 > > > + > > +/** > > + * In case we receive an EPG packet before mpegts context is fully > > + * initialized. > > + */ > > +if (!ts->pkt) > > +return; > > + > > +new_data_packet(section, section_len, ts->pkt); > > +ts->pkt->stream_index = ts->epg_stream->index; > > +ts->stop_parse = 1; > > +} > > + > > static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int > section_len) > > { > > MpegTSContext *ts = filter->u.section_filter.opaque; > > MpegTSSectionFilter *tssf = >u.section_filter; > > SectionHeader h1, *h = > > const uint8_t *p, *p_end, *desc_list_end, *desc_end; > > -int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type; > > +int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type, > > +eit_sched, eit_pres_following; > > char *name, *provider_name; > > > > av_log(ts->stream, AV_LOG_TRACE, "SDT:\n"); > > @@ -2534,6 +2591,13 @@ static void sdt_cb(MpegTSFilter *filter, const > uint8_t *section, int section_len > > val = get8(, p_end); > > if (val < 0) > > break; > > +eit_sched = (val >> 1) & 0x1; > > +eit_pres_following = val & 0x1; > > + > > +if ((eit_sched | eit_pres_following) && !ts->epg_stream) > > +av_log(ts->stream, AV_LOG_WARNING, "SDT table advertise EIT > but no" > > + " packets were received yet.\n"); > > + > > You should remove this, there are tons of captures where EIT PID is >
Re: [FFmpeg-devel] [PATCH] DVB EPG decoder
On Thu, 12 Sep 2019, Anthony Delannoy wrote: But I'd like to see data decoder in the future to use more easily EPG/NIT/BAT etc tables. Will it be possible? With modifications if it needs to be? I don't see how, as it does not fit into the concept of the libav* libraries. I feel this belongs to a separate library. A new libavdata library for data handling ? In case of a scrambled EIT (which I have never seen myself in the wild) you'd print this at every packet. You should either remove the warning, or check if this is the first time (e.g. by checking if the EPG stream was just created). You should remove this, there are tons of captures where EIT PID is intentionally filtered, we should not spam the user. I made both of this log print on AV_LOG_TRACE level, I rather keep them here if i need them. Thanks, applied patches 1-3 with some slight changes. Sorry, but I removed the TRACE log for the no EIT packets received case, I just don't see it useful. Regards, Marton ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] DVB EPG decoder
> > But I'd like to see data decoder in the future to use more easily > > EPG/NIT/BAT etc tables. > > Will it be possible? With modifications if it needs to be? > > I don't see how, as it does not fit into the concept of the libav* > libraries. I feel this belongs to a separate library. A new libavdata library for data handling ? > In case of a scrambled EIT (which I have never seen myself in the wild) you'd > print this at every packet. You should either remove the warning, or check if > this is the first time (e.g. by checking if the EPG stream was just created). > You should remove this, there are tons of captures where EIT PID is > intentionally filtered, we should not spam the user. I made both of this log print on AV_LOG_TRACE level, I rather keep them here if i need them. > Not needed, as context is zero initialized. I deleted the unnecessary init. Anthony Delannoy From 4fe946f525a9409321ea2bc4f78a74857b9ee2b0 Mon Sep 17 00:00:00 2001 From: Anthony Delannoy Date: Fri, 26 Jul 2019 11:41:00 +0200 Subject: [PATCH 1/3] avformat/mpegts: add all pids & tids --- libavformat/mpegts.h | 74 1 file changed, 68 insertions(+), 6 deletions(-) diff --git a/libavformat/mpegts.h b/libavformat/mpegts.h index 272e2be4f7..560c319ef1 100644 --- a/libavformat/mpegts.h +++ b/libavformat/mpegts.h @@ -30,17 +30,79 @@ #define TS_MAX_PACKET_SIZE 204 #define NB_PID_MAX 8192 +#define USUAL_SECTION_SIZE 1024 /* except EIT which is limited to 4096 */ #define MAX_SECTION_SIZE 4096 /* pids */ -#define PAT_PID 0x -#define SDT_PID 0x0011 +#define PAT_PID 0x /* Program Association Table */ +#define CAT_PID 0x0001 /* Conditional Access Table */ +#define TSDT_PID0x0002 /* Transport Stream Description Table */ +#define IPMP_PID0x0003 +/* PID from 0x0004 to 0x000F are reserved */ +#define NIT_PID 0x0010 /* Network Information Table */ +#define SDT_PID 0x0011 /* Service Description Table */ +#define BAT_PID SDT_PID /* Bouquet Association Table */ +#define EIT_PID 0x0012 /* Event Information Table */ +#define RST_PID 0x0013 /* Running Status Table */ +#define TDT_PID 0x0014 /* Time and Date Table */ +#define TOT_PID TDT_PID +#define NET_SYNC_PID0x0015 +#define RNT_PID 0x0016 /* RAR Notification Table */ +/* PID from 0x0017 to 0x001B are reserved for future use */ +/* PID value 0x001C allocated to link-local inband signalling shall not be + * used on any broadcast signals. It shall only be used between devices in a + * controlled environment. */ +#define LINK_LOCAL_PID 0x001C +#define MEASUREMENT_PID 0x001D +#define DIT_PID 0x001E /* Discontinuity Information Table */ +#define SIT_PID 0x001F /* Selection Information Table */ +/* PID from 0x0020 to 0x1FFA may be assigned as needed to PMT, elementary + * streams and other data tables */ +/* PID 0x1FFB is used by DigiCipher 2/ATSC MGT metadata */ +/* PID from 0x1FFC to 0x1FFE may be assigned as needed to PMT, elementary + * streams and other data tables */ +#define NULL_PID0x1FFF /* Null packet (used for fixed bandwidth padding) */ /* table ids */ -#define PAT_TID 0x00 -#define PMT_TID 0x02 -#define M4OD_TID 0x05 -#define SDT_TID 0x42 +#define PAT_TID 0x00 /* Program Association section */ +#define CAT_TID 0x01 /* Conditional Access section */ +#define PMT_TID 0x02 /* Program Map section */ +#define TSDT_TID0x03 /* Transport Stream Description section */ +/* TID from 0x04 to 0x3F are reserved */ +#define M4OD_TID0x05 +#define NIT_TID 0x40 /* Network Information section - actual network */ +#define ONIT_TID0x41 /* Network Information section - other network */ +#define SDT_TID 0x42 /* Service Description section - actual TS */ +/* TID from 0x43 to 0x45 are reserved for future use */ +#define OSDT_TID0x46 /* Service Descrition section - other TS */ +/* TID from 0x47 to 0x49 are reserved for future use */ +#define BAT_TID 0x4A /* Bouquet Association section */ +#define UNT_TID 0x4B /* Update Notification Table section */ +#define DFI_TID 0x4C /* Downloadable Font Info section */ +/* TID 0x4D is reserved for future use */ +#define EIT_TID 0x4E /* Event Information section - actual TS */ +#define OEIT_TID0x4F /* Event Information section - other TS */ +#define EITS_START_TID 0x50 /* Event Information section schedule - actual TS */ +#define EITS_END_TID0x5F /* Event Information section schedule - actual TS */ +#define OEITS_START_TID 0x60 /* Event Information section schedule - other TS */ +#define OEITS_END_TID 0x6F /* Event Information section schedule - other TS */ +#define TDT_TID 0x70 /* Time Date section */ +#define RST_TID 0x71 /* Running Status section */ +#define ST_TID 0x72 /* Stuffing section */ +#define
Re: [FFmpeg-devel] [PATCH] DVB EPG decoder
On Wed, 4 Sep 2019, Anthony Delannoy wrote: Hi I'm still interested to have those three commits merged (update in attachments). Ok, below are some more comments. But I'd like to see data decoder in the future to use more easily EPG/NIT/BAT etc tables. Will it be possible? With modifications if it needs to be? I don't see how, as it does not fit into the concept of the libav* libraries. I feel this belongs to a separate library. From 335b0bf377c1e5cfc5207561adc9621b113759b0 Mon Sep 17 00:00:00 2001 From: Anthony Delannoy Date: Wed, 21 Aug 2019 11:46:56 +0200 Subject: [PATCH 3/3] lavf/mpegts: EPG extraction from mpegts --- libavformat/mpegts.c | 71 ++-- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 0415ceea02..9bb6b6add8 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -168,6 +168,8 @@ struct MpegTSContext { /** filters for various streams specified by PMT + for the PAT and PMT */ MpegTSFilter *pids[NB_PID_MAX]; int current_pid; + +AVStream *epg_stream; }; #define MPEGTS_OPTIONS \ @@ -2498,13 +2500,68 @@ static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len } } +static void eit_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) +{ +MpegTSContext *ts = filter->u.section_filter.opaque; +const uint8_t *p, *p_end; +SectionHeader h1, *h = + +/* + * Sometimes we receive EPG packets but SDT table do not have + * eit_pres_following or eit_sched turned on, so we open EPG + * stream directly here. + */ +if (!ts->epg_stream) { +ts->epg_stream = avformat_new_stream(ts->stream, NULL); +if (!ts->epg_stream) +return; +ts->epg_stream->id = EIT_PID; +ts->epg_stream->codecpar->codec_type = AVMEDIA_TYPE_DATA; +ts->epg_stream->codecpar->codec_id = AV_CODEC_ID_EPG; +} + +if (ts->epg_stream->discard == AVDISCARD_ALL) +return; + +p_end = section + section_len - 4; +p = section; + +if (parse_section_header(h, , p_end) < 0) +return; +if (h->tid < EIT_TID || h->tid > OEITS_END_TID) +return; + +av_log(ts->stream, AV_LOG_TRACE, "EIT: tid received = %.02x\n", h->tid); + +/** + * Service_id 0x is reserved, it indicates that the current EIT table + * is scrambled. + */ +if (h->id == 0x) { +av_log(ts->stream, AV_LOG_WARNING, "Scrambled EIT table received.\n"); +return; +} In case of a scrambled EIT (which I have never seen myself in the wild) you'd print this at every packet. You should either remove the warning, or check if this is the first time (e.g. by checking if the EPG stream was just created). + +/** + * In case we receive an EPG packet before mpegts context is fully + * initialized. + */ +if (!ts->pkt) +return; + +new_data_packet(section, section_len, ts->pkt); +ts->pkt->stream_index = ts->epg_stream->index; +ts->stop_parse = 1; +} + static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) { MpegTSContext *ts = filter->u.section_filter.opaque; MpegTSSectionFilter *tssf = >u.section_filter; SectionHeader h1, *h = const uint8_t *p, *p_end, *desc_list_end, *desc_end; -int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type; +int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type, +eit_sched, eit_pres_following; char *name, *provider_name; av_log(ts->stream, AV_LOG_TRACE, "SDT:\n"); @@ -2534,6 +2591,13 @@ static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len val = get8(, p_end); if (val < 0) break; +eit_sched = (val >> 1) & 0x1; +eit_pres_following = val & 0x1; + +if ((eit_sched | eit_pres_following) && !ts->epg_stream) +av_log(ts->stream, AV_LOG_WARNING, "SDT table advertise EIT but no" + " packets were received yet.\n"); + You should remove this, there are tons of captures where EIT PID is intentionally filtered, we should not spam the user. desc_list_len = get16(, p_end); if (desc_list_len < 0) break; @@ -2984,8 +3048,8 @@ static int mpegts_read_header(AVFormatContext *s) seek_back(s, pb, pos); mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1); - mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1); +mpegts_open_section_filter(ts, EIT_PID, eit_cb, ts, 1); handle_packets(ts, probesize / ts->raw_packet_size); /* if could not find service, enable auto_guess */ @@ -3240,8 +3304,11 @@ MpegTSContext *avpriv_mpegts_parse_open(AVFormatContext *s) ts->raw_packet_size = TS_PACKET_SIZE; ts->stream = s; ts->auto_guess = 1; +ts->epg_stream = NULL; Not needed, as context is
Re: [FFmpeg-devel] [PATCH] DVB EPG decoder
Hi I'm still interested to have those three commits merged (update in attachments). But I'd like to see data decoder in the future to use more easily EPG/NIT/BAT etc tables. Will it be possible? With modifications if it needs to be? Anthony Delannoy Le mar. 3 sept. 2019 à 23:39, Marton Balint a écrit : > > Hi, > > I am not sure if you are interested getting only patch 1, 2 and 3 > merged, but if you are, then here are my comments for patch 3. > > > From 025ec8e8d607d02f2e5b4021783ab8f3b42d0bc1 Mon Sep 17 00:00:00 2001 > > From: Anthony Delannoy > > Date: Wed, 21 Aug 2019 11:46:56 +0200 > > Subject: [PATCH 03/10] lavf/mpegts: EPG extraction from mpegts > > > > --- > > libavformat/mpegts.c | 67 ++-- > > 1 file changed, 65 insertions(+), 2 deletions(-) > > > > diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c > > index 47d8d5f877..03c1753ac7 100644 > > --- a/libavformat/mpegts.c > > +++ b/libavformat/mpegts.c > > @@ -2489,13 +2489,57 @@ static void pat_cb(MpegTSFilter *filter, const > > uint8_t *section, int section_len > > } > > } > > > > +static void eit_cb(MpegTSFilter *filter, const uint8_t *section, int > > section_len) > > +{ > > +MpegTSContext *ts = filter->u.section_filter.opaque; > > +MpegTSSectionFilter *tssf = >u.section_filter; > > +const uint8_t *p, *p_end; > > +SectionHeader h1, *h = > > +int idx; > > +AVProgram *prg; > > Maybe you can check if AVStream->discard == DISCARD_ALL for the EIT stream and > skip the packet if the stream is discarded. > > > + > > +p_end = section + section_len - 4; > > +p = section; > > + > > +if (parse_section_header(h, , p_end) < 0) > > +return; > > +if (h->tid < EIT_TID || h->tid > OEITS_END_TID) > > +return; > > > +if (ts->skip_changes) > > +return; > > +if (skip_identical(h, tssf)) > > +return; > > I don't think these last two checks (skip changes and skip identical) makes > much sense here, just remove them. > > > + > > +idx = ff_find_stream_index(ts->stream, filter->pid); > > +if (idx < 0) > > +return; > > Instead of finding the stream each time, you should simply add an AVStream > *epg_stream to MpegTsContext, set it where you create the stream, and use that > always. > > > + > > +/** > > + * In case we receive an EPG packet before mpegts context is fully > > + * initialized. > > + */ > > +if (!ts->pkt) > > +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; > > +} > > This program based logic is no longer needed since EIT is not added to > programs. > > > +ts->stop_parse = 1; > > +} > > + > > static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int > > section_len) > > { > > MpegTSContext *ts = filter->u.section_filter.opaque; > > MpegTSSectionFilter *tssf = >u.section_filter; > > SectionHeader h1, *h = > > const uint8_t *p, *p_end, *desc_list_end, *desc_end; > > -int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type; > > +int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type, > > +eit_sched, eit_pres_following; > > char *name, *provider_name; > > > > av_log(ts->stream, AV_LOG_TRACE, "SDT:\n"); > > @@ -2525,6 +2569,24 @@ static void sdt_cb(MpegTSFilter *filter, const > > uint8_t *section, int section_len > > val = get8(, p_end); > > if (val < 0) > > break; > > +eit_sched = (val >> 1) & 0x1; > > +eit_pres_following = val & 0x1; > > + > > +if (eit_sched | eit_pres_following) { > > +int idx = ff_find_stream_index(ts->stream, EIT_PID); > > +AVStream *st = (idx >= 0) ? ts->stream->streams[EIT_PID] : > > NULL; > > I guess ts->stream->streams[EIT_PID] wanted to be ts->stream->streams[idx] but > it does not matter because you should rework this if you add epg_stream to > MpegTsContext. > > > + > > +if (!st) { > > +st = avformat_new_stream(ts->stream, NULL); > > +if (!st) > > +return; > > +st->id = EIT_PID; > > +st->program_num = sid; > > +st->codecpar->codec_type = AVMEDIA_TYPE_DATA; > > +st->codecpar->codec_id = AV_CODEC_ID_EPG; > > +} > > +} > > + > > desc_list_len = get16(, p_end); > > if (desc_list_len < 0) > > break; > > @@ -2975,8 +3037,8 @@ static int mpegts_read_header(AVFormatContext *s) > > seek_back(s, pb, pos); > > > >
Re: [FFmpeg-devel] [PATCH] DVB EPG decoder
Hi, I am not sure if you are interested getting only patch 1, 2 and 3 merged, but if you are, then here are my comments for patch 3. From 025ec8e8d607d02f2e5b4021783ab8f3b42d0bc1 Mon Sep 17 00:00:00 2001 From: Anthony Delannoy Date: Wed, 21 Aug 2019 11:46:56 +0200 Subject: [PATCH 03/10] lavf/mpegts: EPG extraction from mpegts --- libavformat/mpegts.c | 67 ++-- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c index 47d8d5f877..03c1753ac7 100644 --- a/libavformat/mpegts.c +++ b/libavformat/mpegts.c @@ -2489,13 +2489,57 @@ static void pat_cb(MpegTSFilter *filter, const uint8_t *section, int section_len } } +static void eit_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) +{ +MpegTSContext *ts = filter->u.section_filter.opaque; +MpegTSSectionFilter *tssf = >u.section_filter; +const uint8_t *p, *p_end; +SectionHeader h1, *h = +int idx; +AVProgram *prg; Maybe you can check if AVStream->discard == DISCARD_ALL for the EIT stream and skip the packet if the stream is discarded. + +p_end = section + section_len - 4; +p = section; + +if (parse_section_header(h, , p_end) < 0) +return; +if (h->tid < EIT_TID || h->tid > OEITS_END_TID) +return; +if (ts->skip_changes) +return; +if (skip_identical(h, tssf)) +return; I don't think these last two checks (skip changes and skip identical) makes much sense here, just remove them. + +idx = ff_find_stream_index(ts->stream, filter->pid); +if (idx < 0) +return; Instead of finding the stream each time, you should simply add an AVStream *epg_stream to MpegTsContext, set it where you create the stream, and use that always. + +/** + * In case we receive an EPG packet before mpegts context is fully + * initialized. + */ +if (!ts->pkt) +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; +} This program based logic is no longer needed since EIT is not added to programs. +ts->stop_parse = 1; +} + static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len) { MpegTSContext *ts = filter->u.section_filter.opaque; MpegTSSectionFilter *tssf = >u.section_filter; SectionHeader h1, *h = const uint8_t *p, *p_end, *desc_list_end, *desc_end; -int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type; +int onid, val, sid, desc_list_len, desc_tag, desc_len, service_type, +eit_sched, eit_pres_following; char *name, *provider_name; av_log(ts->stream, AV_LOG_TRACE, "SDT:\n"); @@ -2525,6 +2569,24 @@ static void sdt_cb(MpegTSFilter *filter, const uint8_t *section, int section_len val = get8(, p_end); if (val < 0) break; +eit_sched = (val >> 1) & 0x1; +eit_pres_following = val & 0x1; + +if (eit_sched | eit_pres_following) { +int idx = ff_find_stream_index(ts->stream, EIT_PID); +AVStream *st = (idx >= 0) ? ts->stream->streams[EIT_PID] : NULL; I guess ts->stream->streams[EIT_PID] wanted to be ts->stream->streams[idx] but it does not matter because you should rework this if you add epg_stream to MpegTsContext. + +if (!st) { +st = avformat_new_stream(ts->stream, NULL); +if (!st) +return; +st->id = EIT_PID; +st->program_num = sid; +st->codecpar->codec_type = AVMEDIA_TYPE_DATA; +st->codecpar->codec_id = AV_CODEC_ID_EPG; +} +} + desc_list_len = get16(, p_end); if (desc_list_len < 0) break; @@ -2975,8 +3037,8 @@ static int mpegts_read_header(AVFormatContext *s) seek_back(s, pb, pos); mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1); - mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1); +mpegts_open_section_filter(ts, EIT_PID, eit_cb, ts, 1); handle_packets(ts, probesize / ts->raw_packet_size); /* if could not find service, enable auto_guess */ @@ -3233,6 +3295,7 @@ MpegTSContext *avpriv_mpegts_parse_open(AVFormatContext *s) ts->auto_guess = 1; mpegts_open_section_filter(ts, SDT_PID, sdt_cb, ts, 1); mpegts_open_section_filter(ts, PAT_PID, pat_cb, ts, 1); +mpegts_open_section_filter(ts, EIT_PID, eit_cb, ts, 1); return ts; } -- 2.23.0 Regards, Marton ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org
Re: [FFmpeg-devel] [PATCH] DVB EPG decoder
Okay, thanks I will patch that Le sam. 24 août 2019 à 20:09, Marton Balint a écrit : > > > On Fri, 23 Aug 2019, Anthony Delannoy wrote: > > >> I think we should only merge the part of this patchset which makes the EIT > >> available as a data stream. Parsing the whole EIT or dumping the data as > >> ASCII is not libavcodec's or libavutil's job. > > > > The EPG decoder does not change the table's data, it just store them > > and it happens to > > contains text sometimes. > > Some utilites functions I made in libavutil/dvb can convert those raw > > data in text > > description(s) for certain descriptors. > > > >> Also there is no such concept in libavcodec as a data decoder, if > >> something happens to > >> work with avcodec_send_packet/avcodec_receive_frame that is mostly luck I > >> believe. > > > > avcodec_send_packet and avcodec_receive_frame both call > > AVCodec::receive_frame if it is > > implemented. That's why my implementation of the EPG decoder does > > contain this function. > > > > For now my test scripts consists to: > > ``` > > 99 if (st->codecpar->codec_id != AV_CODEC_ID_EPG) > > 100 goto free_pkt; > > 101 > > 102 ret = avcodec_send_packet(dec_ctx, ); > > ... > > 112 while (1) { > > 113 ret = avcodec_receive_frame(dec_ctx, frame); > > 114 if (ret < 0) > > 115 break; > > 116 > > 117 for (int i = 0; i < frame->nb_side_data; i++) { > > 118 AVFrameSideData *sd = frame->side_data[i]; > > 119 if (sd && sd->type == AV_FRAME_DATA_EPG_TABLE) { > > 120 EPGTable *table = sd->data; > > 121 av_epg_show_table(table, AV_LOG_WARNING); > > 122 } > > 123 } > > 124 av_frame_unref(frame); > > 125 } > > 126 > > 127 free_pkt: > > 128 av_packet_unref(); > > ``` > > It works as intended and permits to decode EPGTable without issues, I > > tried on multiple channels. > > > > I wanted to permit the table decoding and not just an EPG data stream > > to permit easy reading > > and in the future easy modification before encoding EPG back. > > > >> I am also not sure if we should add the EIT PID to all programs, that > >> would mess up the direct relation between a PMT and an AVProgram, and we > >> probably don't want that. So I'd rather see the EIT data stream as a > >> standalone PID separate from the programs. > > > > I'm not an expert but I think each service/program contains a PMT > > table and all others. So one > > EPG stream (if available) for each service. > > That's what I understood from the ETSI EN 300 468 V1.16.1 > > The EPG stream is a single stream in the whole TS, it is on a single PID. > The PMTs do not reference the EIT PID, therefore we should not make the > EPG stream part of the programs, even if the EPG stream can contain the > schedule of the programs. > > Regards, > Marton > ___ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > To unsubscribe, visit link above, or email > ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe". ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] DVB EPG decoder
On Fri, 23 Aug 2019, Anthony Delannoy wrote: I think we should only merge the part of this patchset which makes the EIT available as a data stream. Parsing the whole EIT or dumping the data as ASCII is not libavcodec's or libavutil's job. The EPG decoder does not change the table's data, it just store them and it happens to contains text sometimes. Some utilites functions I made in libavutil/dvb can convert those raw data in text description(s) for certain descriptors. Also there is no such concept in libavcodec as a data decoder, if something happens to work with avcodec_send_packet/avcodec_receive_frame that is mostly luck I believe. avcodec_send_packet and avcodec_receive_frame both call AVCodec::receive_frame if it is implemented. That's why my implementation of the EPG decoder does contain this function. For now my test scripts consists to: ``` 99 if (st->codecpar->codec_id != AV_CODEC_ID_EPG) 100 goto free_pkt; 101 102 ret = avcodec_send_packet(dec_ctx, ); ... 112 while (1) { 113 ret = avcodec_receive_frame(dec_ctx, frame); 114 if (ret < 0) 115 break; 116 117 for (int i = 0; i < frame->nb_side_data; i++) { 118 AVFrameSideData *sd = frame->side_data[i]; 119 if (sd && sd->type == AV_FRAME_DATA_EPG_TABLE) { 120 EPGTable *table = sd->data; 121 av_epg_show_table(table, AV_LOG_WARNING); 122 } 123 } 124 av_frame_unref(frame); 125 } 126 127 free_pkt: 128 av_packet_unref(); ``` It works as intended and permits to decode EPGTable without issues, I tried on multiple channels. I wanted to permit the table decoding and not just an EPG data stream to permit easy reading and in the future easy modification before encoding EPG back. I am also not sure if we should add the EIT PID to all programs, that would mess up the direct relation between a PMT and an AVProgram, and we probably don't want that. So I'd rather see the EIT data stream as a standalone PID separate from the programs. I'm not an expert but I think each service/program contains a PMT table and all others. So one EPG stream (if available) for each service. That's what I understood from the ETSI EN 300 468 V1.16.1 The EPG stream is a single stream in the whole TS, it is on a single PID. The PMTs do not reference the EIT PID, therefore we should not make the EPG stream part of the programs, even if the EPG stream can contain the schedule of the programs. Regards, Marton ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] DVB EPG decoder
> I think we should only merge the part of this patchset which makes the EIT > available as a data stream. Parsing the whole EIT or dumping the data as > ASCII is not libavcodec's or libavutil's job. The EPG decoder does not change the table's data, it just store them and it happens to contains text sometimes. Some utilites functions I made in libavutil/dvb can convert those raw data in text description(s) for certain descriptors. > Also there is no such concept in libavcodec as a data decoder, if something > happens to > work with avcodec_send_packet/avcodec_receive_frame that is mostly luck I > believe. avcodec_send_packet and avcodec_receive_frame both call AVCodec::receive_frame if it is implemented. That's why my implementation of the EPG decoder does contain this function. For now my test scripts consists to: ``` 99 if (st->codecpar->codec_id != AV_CODEC_ID_EPG) 100 goto free_pkt; 101 102 ret = avcodec_send_packet(dec_ctx, ); ... 112 while (1) { 113 ret = avcodec_receive_frame(dec_ctx, frame); 114 if (ret < 0) 115 break; 116 117 for (int i = 0; i < frame->nb_side_data; i++) { 118 AVFrameSideData *sd = frame->side_data[i]; 119 if (sd && sd->type == AV_FRAME_DATA_EPG_TABLE) { 120 EPGTable *table = sd->data; 121 av_epg_show_table(table, AV_LOG_WARNING); 122 } 123 } 124 av_frame_unref(frame); 125 } 126 127 free_pkt: 128 av_packet_unref(); ``` It works as intended and permits to decode EPGTable without issues, I tried on multiple channels. I wanted to permit the table decoding and not just an EPG data stream to permit easy reading and in the future easy modification before encoding EPG back. > I am also not sure if we should add the EIT PID to all programs, that > would mess up the direct relation between a PMT and an AVProgram, and we > probably don't want that. So I'd rather see the EIT data stream as a > standalone PID separate from the programs. I'm not an expert but I think each service/program contains a PMT table and all others. So one EPG stream (if available) for each service. That's what I understood from the ETSI EN 300 468 V1.16.1 ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] DVB EPG decoder
On Thu, 22 Aug 2019, Anthony Delannoy wrote: Hi fails to build on MIPS Seems to be because of these two structs within EPGTable and EPGSubTable: +struct { +int nb_descriptors; +void **descriptors; +}; I made modifications to avoid issues you encountered and put fate modifications in the right commit(s). Afaict, some patches change files that were added in earlier patches. This may not be ideal. I committed changements to files (dvb.{h,c}) I added earlier because I need descriptors files (dvbdescriptors.{h,c}) before those changes and descriptors files need the first version of the dvb file (basic get functions). Why are the big api changes necessary at all? I made those big changements to ease the implementation of all others DVB tables (i'd like to add support for NIT, AIT, TDT,... after EPG) by using the same helper functions (avpriv_dvb_get{8,16,32}()) and especially the same DVB descriptors code because each descriptor is supported by multiple table in general. I think we should only merge the part of this patchset which makes the EIT available as a data stream. Parsing the whole EIT or dumping the data as ASCII is not libavcodec's or libavutil's job. Also there is no such concept in libavcodec as a data decoder, if something happens to work with avcodec_send_packet/avcodec_receive_frame that is mostly luck I believe. I am also not sure if we should add the EIT PID to all programs, that would mess up the direct relation between a PMT and an AVProgram, and we probably don't want that. So I'd rather see the EIT data stream as a standalone PID separate from the programs. Regards, Marton ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] DVB EPG decoder
Am Do., 22. Aug. 2019 um 12:42 Uhr schrieb Michael Niedermayer : > > On Wed, Aug 21, 2019 at 06:28:08PM +0200, Anthony Delannoy wrote: > > Hi, > > > > In the attached files is the first implementation of: > > * dvb descriptors parsing api to ease their use on different sections (for > > now i've only implemented EIT section) > > * EIT table and subtable > > * EIT callback in lavf/mpegts.c generating epg AVPacket > > * EPG decoder to decode epg AVPacket and store decoded infos in > > AVFrame::side_data with a new type AV_FRAME_DATA_EPG_TABLE > > > > I kept the EPG{Sub,}Table as raw as possible, EPG data manipulation have to > > be done using FFmpeg API for now. > > > > Let me know if those patch need changements/improvements. > > fate checksums change so this needs to update them if the changes are intended To clarify: This should not be a 13th patch but every patch has to include the fate changes it causes. > fails to build on MIPS Seems to be because of these two structs within EPGTable and EPGSubTable: +struct { +int nb_descriptors; +void **descriptors; +}; Some of your new files do not contain license headers, please fix that independently of other reviews. Afaict, some patches change files that were added in earlier patches. This may not be ideal. Why are the big api changes necessary at all? Carl Eugen ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".
Re: [FFmpeg-devel] [PATCH] DVB EPG decoder
On Wed, Aug 21, 2019 at 06:28:08PM +0200, Anthony Delannoy wrote: > Hi, > > In the attached files is the first implementation of: > * dvb descriptors parsing api to ease their use on different sections (for > now i've only implemented EIT section) > * EIT table and subtable > * EIT callback in lavf/mpegts.c generating epg AVPacket > * EPG decoder to decode epg AVPacket and store decoded infos in > AVFrame::side_data with a new type AV_FRAME_DATA_EPG_TABLE > > I kept the EPG{Sub,}Table as raw as possible, EPG data manipulation have to > be done using FFmpeg API for now. > > Let me know if those patch need changements/improvements. fate checksums change so this needs to update them if the changes are intended fails to build on MIPS CC libavcodec/epgdec.o In file included from src/libavcodec/epgdec.c:31: src/libavutil/dvb.h:123: warning: declaration does not declare anything In file included from src/libavcodec/epgdec.c:31: src/libavutil/dvb.h:158: warning: declaration does not declare anything In file included from src/libavcodec/epgdec.c:32: src/libavutil/dvbdescriptors.h:275: warning: declaration does not declare anything In file included from src/libavcodec/epgdec.c:32: src/libavutil/dvbdescriptors.h:748: warning: declaration does not declare anything In file included from src/libavcodec/epgdec.c:32: src/libavutil/dvbdescriptors.h:965: warning: declaration does not declare anything src/libavcodec/epgdec.c: In function ‘epg_handle_descriptor’: src/libavcodec/epgdec.c:57: error: ‘EPGSubTable’ has no member named ‘descriptors’ src/libavcodec/epgdec.c:57: error: ‘EPGSubTable’ has no member named ‘nb_descriptors’ src/libavcodec/epgdec.c:61: error: ‘EPGSubTable’ has no member named ‘descriptors’ src/libavcodec/epgdec.c:61: error: ‘EPGSubTable’ has no member named ‘nb_descriptors’ src/libavcodec/epgdec.c: In function ‘epg_receive_frame’: src/libavcodec/epgdec.c:159: error: ‘EPGTable’ has no member named ‘subtables’ src/libavcodec/epgdec.c:159: error: ‘EPGTable’ has no member named ‘nb_subtables’ src/libavcodec/epgdec.c:162: error: ‘EPGTable’ has no member named ‘subtables’ src/libavcodec/epgdec.c:162: error: ‘EPGTable’ has no member named ‘nb_subtables’ src/libavcodec/epgdec.c:163: error: ‘EPGTable’ has no member named ‘subtables’ src/libavcodec/epgdec.c:163: error: ‘EPGTable’ has no member named ‘nb_subtables’ src/libavcodec/epgdec.c:165: error: ‘EPGTable’ has no member named ‘subtables’ src/libavcodec/epgdec.c:165: error: ‘EPGTable’ has no member named ‘nb_subtables’ make: *** [libavcodec/epgdec.o] Error 1 [...] -- Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB Let us carefully observe those good qualities wherein our enemies excel us and endeavor to excel them, by avoiding what is faulty, and imitating what is excellent in them. -- Plutarch signature.asc Description: PGP signature ___ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".