Re: [FFmpeg-devel] [PATCH] DVB EPG decoder

2019-09-26 Thread Aman Gupta
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

2019-09-19 Thread Marton Balint



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

2019-09-11 Thread Anthony Delannoy
> > 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

2019-09-07 Thread Marton Balint



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

2019-09-04 Thread Anthony Delannoy
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

2019-09-03 Thread Marton Balint

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

2019-08-26 Thread Anthony Delannoy
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

2019-08-24 Thread Marton Balint


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

2019-08-23 Thread Anthony Delannoy
> 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

2019-08-22 Thread Marton Balint



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

2019-08-22 Thread Carl Eugen Hoyos
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

2019-08-22 Thread 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

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".