Hola David,

thank you for clarifying it, maybe we leave 0x28 by default and add a "nit_private" option for: none, NorDig, UK ?

Here is the function so far:

+static void mpegts_write_nit(AVFormatContext *s)
+{
+    int i, lcn_count=0;
+    MpegTSWrite *ts = s->priv_data;
+ uint8_t data[SECTION_LENGTH], *q, *desc_len_ptr, *loop_len_ptr, *lcn_len_ptr;
+    AVDictionaryEntry *logical_channel;
+    AVProgram *program;
+
+    q = data;
+
+    //network name
+    put16(&q, 0xf000 | ts->provider_name[0]);
+    *q++ = 0x40;
+    putbuf(&q, ts->provider_name, ts->provider_name[0]+1);
+
+    //TS loop
+    loop_len_ptr = q;
+    q += 2;
+    put16(&q, ts->transport_stream_id);
+    put16(&q, ts->original_network_id);
+
+    //transport descriptor
+    desc_len_ptr = q;
+    q += 2;
+
+    //service list descriptor
+    *q++ = 0x41;
+    *q++ = 3 * ts->nb_services;
+    for(i = 0; i < ts->nb_services; i++) {
+        put16(&q, ts->services[i]->sid);
+        *q++ = ts->service_type;
+        program = s->programs[i];
+ if (av_dict_get(program->metadata, "logical_channel_number", NULL, 0))
+            lcn_count++;
+    }
+
+    if (lcn_count > 0) {
+        //logical channel descriptor
+        *q++ = 0x83;
+        lcn_len_ptr = q++;
+        for (i = 0; i < ts->nb_services; i++) {
+            program = s->programs[i];
+ logical_channel = av_dict_get(program->metadata, "logical_channel_number", NULL, 0);
+            if (logical_channel) {
+                put16(&q, ts->services[i]->sid);
+                put16(&q, 0xfc00 | atoi(logical_channel->value));
+            }
+        }
+        *lcn_len_ptr = lcn_count * 4;
+        //private data specifier descriptor
+        *q++ = 0x5F;
+        *q++ = 0x04;
+        put16(&q, 0x00);
+        put16(&q, 0x28);
+    }
+
+    //calculate lengths
+    put16(&desc_len_ptr, 0xf000 | q - (desc_len_ptr+2));
+    put16(&loop_len_ptr, 0xf000 | q - (loop_len_ptr+2));
+
+ mpegts_write_section1(&ts->nit, NIT_TID, ts->original_network_id, ts->tables_version, 0, 0,
+                          data, q - data);
+}


Hi,

Hi Marton,

Il 2021-05-12 19:18 Marton Balint ha scritto:
> On Wed, 12 May 2021, Ubaldo Porcheddu wrote:
>
>> Hi Marton,
>>
>>>> +    }
>>>> +
>>>> +    //private data
>>>> +    desc_len += 6 + 2;
>>>> +    *q++ = 0x5F;
>>>> +    *q++ = 4;
>>>> +    *q++ = 0x00;
>>>> +    *q++ = 0x00;
>>>> +    put16(&q, 40);
>>>
>>> What are these?
>>
>> I didn't find any official document about it but this seems to be the
>> way many national (FR,IT,UK) broadcasters are writing the virtual
>> channel private data header and the one recognized by many popular tv
>> on the market.
>
> But this looks like a separate descriptor from the virtual channels
> (logical_channel_descriptor).

I think it is better to remove it until it is more clear what it does,
or maybe we add an extra mpegts flag like "nit_lcn_extra" ?


The private data specifier descriptor is needed for the TV to
correctly process the LCN descriptor. When it is needed, you have to
include both or none.
Also, in the Scandinavian countries, that use the NORDIG spec, the LCN
descriptor has a different format, though I think the European format
may still be understood.

Specs can be found here for NORDIG :
https://nordig.org/wp-content/uploads/2017/03/NorDig-Unified_ver_2_6.pdf

Specs for the European LCN can be found here, it's the French spec,
but the rest are the same:
https://www.csa.fr/web/index.php/content/download/253685/723620/version/1/file/CSA-Signalling-Profilev3.4.pdf

Specs for the Australian LCN descriptor can be found here:
https://www.freetv.com.au/wp-content/uploads/2019/08/OP-41-LCN-Descriptor-Issue-8-July-2016.pdf

The rules, as far as I know them are:

NORDIG --> Private Data Specifier = 0x00000029,  LCN Descriptor Tag =
0x83 (legacy), 0x87 (Nordig version)
United Kingdom --> Private Data Specifier = 0x0000233A,  LCN
Descriptor Tag = 0x83
Rest of Europe + Most of the World --> Private Data Specifier =
0x00000028,  LCN Descriptor Tag = 0x83
Australia --> _Do_not_include_Private_data_specifier_descriptor_ , LCN
Descriptor Tag = 0x83

My suggestion would be to add an "LCN_mode" parameters, with values:
NO_LCN, Australia,UK,Nordig, etc

Regards

David


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

Reply via email to