[vlc-commits] demux: ts: add support for ARIB channels logos

Francois Cartegnie git at videolan.org
Wed Jun 21 21:34:45 CEST 2017


vlc | branch: master | Francois Cartegnie <fcvlcdev at free.fr> | Tue Jun 20 15:26:12 2017 +0200| [de5e761dea395471fe5fbda2a5e7212bb309843a] | committer: Francois Cartegnie

demux: ts: add support for ARIB channels logos

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=de5e761dea395471fe5fbda2a5e7212bb309843a
---

 modules/demux/Makefile.am               |   1 +
 modules/demux/mpeg/ts_arib.c            | 212 ++++++++++++++++++++++++++++++++
 modules/demux/mpeg/ts_arib.h            |  54 ++++++++
 modules/demux/mpeg/ts_si.c              | 122 +++++++++++++++++-
 modules/demux/mpeg/ts_streams.c         |   8 ++
 modules/demux/mpeg/ts_streams_private.h |   7 ++
 6 files changed, 403 insertions(+), 1 deletion(-)

diff --git a/modules/demux/Makefile.am b/modules/demux/Makefile.am
index d0839a1198..5a3a84b691 100644
--- a/modules/demux/Makefile.am
+++ b/modules/demux/Makefile.am
@@ -248,6 +248,7 @@ libts_plugin_la_SOURCES = demux/mpeg/ts.c demux/mpeg/ts.h \
         demux/mpeg/ts_scte.h demux/mpeg/ts_scte.c \
         demux/mpeg/sections.c demux/mpeg/sections.h \
         demux/mpeg/mpeg4_iod.c demux/mpeg/mpeg4_iod.h \
+        demux/mpeg/ts_arib.c demux/mpeg/ts_arib.h \
         demux/mpeg/ts_sl.c demux/mpeg/ts_sl.h \
         demux/mpeg/ts_metadata.c demux/mpeg/ts_metadata.h \
         demux/mpeg/ts_hotfixes.c demux/mpeg/ts_hotfixes.h \
diff --git a/modules/demux/mpeg/ts_arib.c b/modules/demux/mpeg/ts_arib.c
new file mode 100644
index 0000000000..432c31a6d0
--- /dev/null
+++ b/modules/demux/mpeg/ts_arib.c
@@ -0,0 +1,212 @@
+/*****************************************************************************
+ * ts_arib.c : TS demux ARIB specific handling
+ *****************************************************************************
+ * Copyright (C) 2017 - VideoLAN Authors
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <vlc_common.h>
+#include <vlc_demux.h>
+
+#include "ts_pid.h"
+#include "ts.h"
+
+#include "ts_arib.h"
+
+/*
+ * ARIB TR-B21
+ * Logo PNG is 8 bit indexed dans the palette is missing,
+ * provided as a CLUT. We need to reinject the CLUT as a
+ * split palette + transparency (as PNG only allows split alpha table)
+*/
+
+/* ARIB TR-B14-1 Appendix 1 */
+static const unsigned char CLUT_to_chunks[] = {
+    /* size + PLTE */
+    0x00, 0x00, 0x01, 0x80, 0x50, 0x4c, 0x54, 0x45,
+    /* DATA ARIB TR-B14-1 Appendix 1 */
+    0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, /* 0-7 */
+    0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+
+    0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0xff, 0xff, 0x00, /* 8-15 */
+    0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+
+    0x00, 0x00, 0x55, 0x00, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x55, 0xaa, /* 16-23 */
+    0x00, 0x55, 0xff, 0x00, 0xaa, 0x55, 0x00, 0xaa, 0xff, 0x00, 0xff, 0x55,
+
+    0x00, 0xff, 0xaa, 0x55, 0x00, 0x00, 0x55, 0x00, 0x55, 0x55, 0x00, 0xaa, /* 24-31 */
+    0x55, 0x00, 0xff, 0x55, 0x55, 0x00, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa,
+
+    0x55, 0x55, 0xff, 0x55, 0xaa, 0x00, 0x55, 0xaa, 0x00, 0x55, 0xaa, 0x55, /* 32-39 */
+    0x55, 0xaa, 0xaa, 0x55, 0xaa, 0xff, 0x55, 0xff, 0x00, 0x55, 0xff, 0x55,
+
+    0x55, 0xff, 0xff, 0xaa, 0x00, 0x55, 0xaa, 0x00, 0xff, 0xaa, 0x55, 0x00, /* 40-47 */
+    0xaa, 0x55, 0x55, 0xaa, 0x55, 0xaa, 0xaa, 0x55, 0xff, 0xaa, 0xaa, 0x55,
+
+    0xaa, 0xaa, 0xff, 0xaa, 0xff, 0x00, 0xaa, 0xff, 0x55, 0xaa, 0xff, 0xaa, /* 48-55 */
+    0xaa, 0xff, 0xff, 0xff, 0x00, 0x55, 0xff, 0x00, 0xaa, 0xff, 0x55, 0x00,
+
+    0xff, 0x55, 0x55, 0xff, 0x55, 0xaa, 0xff, 0x55, 0xff, 0xff, 0xaa, 0x00, /* 56-63 */
+    0xff, 0xaa, 0x55, 0xff, 0xaa, 0xaa, 0xff, 0xaa, 0xff, 0xff, 0xff, 0x55,
+
+    0xff, 0xff, 0xaa, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, /* 64-71 */
+    0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0xff, 0x00, 0xff, 0xff,
+
+    0xff, 0xff, 0xff, 0xaa, 0x00, 0x00, 0x00, 0xaa, 0x00, 0xaa, 0xaa, 0x00, /* 72-79 */
+    0x00, 0x00, 0xaa, 0xaa, 0x00, 0xaa, 0x00, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+
+    0x00, 0x00, 0x55, 0x00, 0x55, 0x00, 0x00, 0x55, 0x55, 0x00, 0x55, 0xaa, /* 80-87 */
+    0x00, 0x55, 0xff, 0x00, 0xaa, 0x55, 0x00, 0xaa, 0xff, 0x00, 0xff, 0x55,
+
+    0x00, 0xff, 0xaa, 0x55, 0x00, 0x00, 0x55, 0x00, 0x55, 0x55, 0x00, 0xaa, /* 88-95 */
+    0x55, 0x00, 0xff, 0x55, 0x55, 0x00, 0x55, 0x55, 0x55, 0x55, 0x55, 0xaa,
+
+    0x55, 0x55, 0xff, 0x55, 0xaa, 0x00, 0x55, 0xaa, 0x55, 0x55, 0xaa, 0xaa, /* 96-103 */
+    0x55, 0xaa, 0xff, 0x55, 0xff, 0x00, 0x55, 0xff, 0x55, 0x55, 0xff, 0xaa,
+
+    0x55, 0xff, 0xff, 0xaa, 0x00, 0x55, 0xaa, 0x00, 0xff, 0xaa, 0x55, 0x00, /* 104-111 */
+    0xaa, 0x55, 0x55, 0xaa, 0x55, 0xaa, 0xaa, 0x55, 0xff, 0xaa, 0xaa, 0x55,
+
+    0xaa, 0xaa, 0xff, 0xaa, 0xff, 0x00, 0xaa, 0xff, 0x55, 0xaa, 0xff, 0xaa, /* 112-119 */
+    0xaa, 0xff, 0xff, 0xff, 0x00, 0x55, 0xff, 0x00, 0xaa, 0xff, 0x55, 0x00,
+
+    0xff, 0x55, 0x55, 0xff, 0x55, 0xaa, 0xff, 0x55, 0xff, 0xff, 0xaa, 0x00, /* 120-127 */
+    0xff, 0xaa, 0x55, 0xff, 0xaa, 0xaa, 0xff, 0xaa, 0xff, 0xff, 0xff, 0x55,
+
+    /* CRC32 (all data including type, without length and crc) . pngcheck output being the lazy way */
+    0x4f, 0xed, 0xfc, 0x8d,
+
+    /* Second Chunk */
+
+    /* size + tRNS */
+    0x00, 0x00, 0x00, 0x80, 0x74, 0x52, 0x4e, 0x53,
+
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, /* 0-63 */
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+    0xff, 0xff, 0xff, 0xff,
+
+    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, /* 64-127 */
+    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+    0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+    0x80, 0x80, 0x80, 0x80,
+
+    /* CRC32 */
+    0xfa, 0xe9, 0x51, 0x40,
+};
+static const unsigned int CLUT_to_chunks_len = sizeof(CLUT_to_chunks);
+
+bool ts_arib_inject_png_palette( const uint8_t *p_in, size_t i_in, uint8_t **pp_out, size_t *pi_out )
+{
+    const uint8_t *p_data = p_in;
+    const uint8_t *p_idat = NULL;
+    size_t i_data = i_in - 8;
+    p_data += 8;
+    i_data -= 8;
+
+    while( i_data > 11 )
+    {
+        uint32_t i_len = GetDWBE( p_data );
+        if( i_len > 0x7FFFFFFFU || i_len > i_data - 12 )
+            break;
+
+        uint32_t i_chunk = VLC_FOURCC(p_data[4], p_data[5], p_data[6], p_data[7]);
+        if( i_chunk == VLC_FOURCC('I', 'D', 'A', 'T') )
+        {
+            p_idat = p_data;
+            break;
+        }
+
+        p_data += i_len + 12;
+        i_data -= i_len + 12;
+    }
+
+    if( !p_idat )
+        return false;
+
+    {
+        uint8_t *p_out = *pp_out = malloc( i_in + CLUT_to_chunks_len );
+        if( !p_out )
+            return false;
+        *pi_out = i_in + CLUT_to_chunks_len;
+
+        const size_t i_head = p_data - p_in;
+        memcpy( p_out, p_in, i_head );
+        memcpy( &p_out[i_head], CLUT_to_chunks, CLUT_to_chunks_len );
+        memcpy( &p_out[i_head + CLUT_to_chunks_len], p_data, i_in - i_head );
+    }
+
+    return true;
+}
+
+
+void ts_arib_logo_dr_Delete( ts_arib_logo_dr_t *p_dr )
+{
+    free( p_dr->p_logo_char );
+    free( p_dr );
+}
+
+ts_arib_logo_dr_t * ts_arib_logo_dr_Decode( const uint8_t *p_data, size_t i_data )
+{
+    if( i_data < 2 )
+        return NULL;
+
+    ts_arib_logo_dr_t *p_dr = calloc( 1, sizeof(*p_dr) );
+    if( p_dr )
+    {
+        p_dr->i_logo_version = p_data[0];
+        switch( p_data[0] )
+        {
+            case 1:
+                if( i_data == 7 )
+                {
+                    p_dr->i_logo_id = ((p_data[1] & 0x01) << 8) | p_data[2];
+                    p_dr->i_logo_version = ((p_data[3] & 0x0F) << 8) | p_data[4];
+                    p_dr->i_download_data_id = (p_data[5] << 8) | p_data[6];
+                    return p_dr;
+                }
+                break;
+            case 2:
+                if( i_data == 3 )
+                {
+                    p_dr->i_logo_id = ((p_data[1] & 0x01) << 8) | p_data[2];
+                    return p_dr;
+                }
+                break;
+            case 3:
+                if( i_data > 2 )
+                {
+                    p_dr->p_logo_char = malloc( i_data - 1 );
+                    if( p_dr->p_logo_char )
+                    {
+                        p_dr->i_logo_char = i_data - 1;
+                        memcpy( p_dr->p_logo_char, &p_data[1], p_dr->i_logo_char );
+                        return p_dr;
+                    }
+                }
+            default:
+                break;
+        }
+        ts_arib_logo_dr_Delete( p_dr );
+    }
+    return NULL;
+}
diff --git a/modules/demux/mpeg/ts_arib.h b/modules/demux/mpeg/ts_arib.h
new file mode 100644
index 0000000000..26502496a7
--- /dev/null
+++ b/modules/demux/mpeg/ts_arib.h
@@ -0,0 +1,54 @@
+/*****************************************************************************
+ * ts_arib.h : TS demux ARIB specific handling
+ *****************************************************************************
+ * Copyright (C) 2017 - VideoLAN Authors
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *****************************************************************************/
+#ifndef VLC_TS_ARIB_H
+#define VLC_TS_ARIB_H
+
+#define TS_ARIB_CDT_PID                                0x29
+
+#define TS_ARIB_CDT_TABLE_ID                           0xC8
+
+#define TS_ARIB_DR_LOGO_TRANSMISSION                   0xCF
+
+#define TS_ARIB_CDT_DATA_TYPE_LOGO      0x01
+
+#define TS_ARIB_LOGO_TYPE_HD_LARGE      0x05
+#define TS_ARIB_LOGO_TYPE_HD_SMALL      0x02
+#define TS_ARIB_LOGO_TYPE_SD43_LARGE    0x03
+#define TS_ARIB_LOGO_TYPE_SD43_SMALL    0x00
+#define TS_ARIB_LOGO_TYPE_SD169_LARGE   0x04
+#define TS_ARIB_LOGO_TYPE_SD169_SMALL   0x01
+
+/* logo_transmission_descriptor */
+typedef struct
+{
+    uint8_t  i_transmission_mode;
+    uint16_t i_logo_id;
+    uint16_t i_logo_version;
+    uint16_t i_download_data_id;
+    uint8_t *p_logo_char;
+    size_t   i_logo_char;
+} ts_arib_logo_dr_t;
+
+ts_arib_logo_dr_t * ts_arib_logo_dr_Decode( const uint8_t *, size_t );
+void ts_arib_logo_dr_Delete( ts_arib_logo_dr_t * );
+
+bool ts_arib_inject_png_palette( const uint8_t *p_in, size_t i_in,
+                                 uint8_t **pp_out, size_t *pi_out );
+
+#endif
diff --git a/modules/demux/mpeg/ts_si.c b/modules/demux/mpeg/ts_si.c
index 5bfeee5e02..f28b7253c4 100644
--- a/modules/demux/mpeg/ts_si.c
+++ b/modules/demux/mpeg/ts_si.c
@@ -25,6 +25,7 @@
 #include <vlc_meta.h>
 #include <vlc_epg.h>
 #include <vlc_charset.h>   /* FromCharset, for EIT */
+#include <vlc_input.h>
 
 #ifndef _DVBPSI_DVBPSI_H_
  #include <dvbpsi/dvbpsi.h>
@@ -35,8 +36,11 @@
 #include <dvbpsi/eit.h> /* EIT support */
 #include <dvbpsi/tot.h> /* TDT support */
 #include <dvbpsi/dr.h>
+#include <dvbpsi/psi.h>
 
 #include "ts_si.h"
+#include "ts_arib.h"
+#include "ts_decoders.h"
 
 #include "ts_pid.h"
 #include "ts_streams_private.h"
@@ -152,6 +156,7 @@ static void SDTCallBack( demux_t *p_demux, dvbpsi_sdt_t *p_sdt )
 {
     demux_sys_t          *p_sys = p_demux->p_sys;
     ts_pid_t             *sdt = GetPID(p_sys, TS_SI_SDT_PID);
+    ts_pat_t             *p_pat = ts_pid_Get(&p_sys->pids, 0)->u.p_pat;
     dvbpsi_sdt_service_t *p_srv;
 
     msg_Dbg( p_demux, "SDTCallBack called" );
@@ -169,9 +174,11 @@ static void SDTCallBack( demux_t *p_demux, dvbpsi_sdt_t *p_sdt )
     {
         attach_SI_decoders( TS_SI_EIT_PID, "EIT", eitpid );
         attach_SI_decoders( TS_SI_TDT_PID, "TDT", tdtpid );
-
+        if( p_sys->standard == TS_STANDARD_ARIB )
+            attach_SI_decoders( TS_ARIB_CDT_PID, "CDT", cdtpid );
     }
 
+
     msg_Dbg( p_demux, "new SDT ts_id=%"PRIu16" version=%"PRIu8" current_next=%d "
              "network_id=%"PRIu16,
              p_sdt->i_extension,
@@ -182,6 +189,7 @@ static void SDTCallBack( demux_t *p_demux, dvbpsi_sdt_t *p_sdt )
 
     for( p_srv = p_sdt->p_first_service; p_srv; p_srv = p_srv->p_next )
     {
+        ts_pmt_t            *p_pmt = ts_pat_Get_pmt( p_pat, p_srv->i_service_id );
         vlc_meta_t          *p_meta;
         dvbpsi_descriptor_t *p_dr;
 
@@ -271,6 +279,42 @@ static void SDTCallBack( demux_t *p_demux, dvbpsi_sdt_t *p_sdt )
                 free( str1 );
                 free( str2 );
             }
+            else if( p_sys->standard == TS_STANDARD_ARIB &&
+                     p_dr->i_tag == TS_ARIB_DR_LOGO_TRANSMISSION && p_pmt )
+            {
+                ts_arib_logo_dr_t *p_logodr = ts_arib_logo_dr_Decode( p_dr->p_data, p_dr->i_length );
+                if( p_logodr )
+                {
+                    if( p_logodr->i_transmission_mode == 0 )
+                    {
+                        p_pmt->arib.i_logo_id = p_logodr->i_logo_id;
+                        p_pmt->arib.i_download_id = p_logodr->i_download_data_id;
+                    }
+                    else if( p_logodr->i_transmission_mode == 1 )
+                    {
+                        p_pmt->arib.i_logo_id = p_logodr->i_logo_id;
+                    }
+                    else /* TODO simple logo identifier */
+                    {
+
+                    }
+
+                    if( p_pmt->arib.i_logo_id > -1 )
+                    {
+                        char *psz_name;
+                        if( asprintf( &psz_name, "attachment://onid[%"PRIx16"]_channel_logo_id[%"PRIx16"]q[%d]",
+                                      p_sdt->i_network_id, p_logodr->i_logo_id,
+                                      TS_ARIB_LOGO_TYPE_HD_LARGE ) > -1 )
+                        {
+                            vlc_meta_SetArtURL( p_meta, psz_name );
+                            vlc_meta_AddExtra( p_meta, "ARTURL", psz_name );
+                            free( psz_name );
+                        }
+                    }
+
+                    ts_arib_logo_dr_Delete( p_logodr );
+                }
+            }
         }
 
         if( p_srv->i_running_status >= 0x01 && p_srv->i_running_status <= 0x04 )
@@ -606,6 +650,76 @@ static void EITCallBack( demux_t *p_demux, dvbpsi_eit_t *p_eit )
     dvbpsi_eit_delete( p_eit );
 }
 
+static void ARIB_CDT_RawCallback( dvbpsi_t *p_handle, const dvbpsi_psi_section_t* p_section,
+                                  void *p_cdtpid )
+{
+    VLC_UNUSED(p_cdtpid);
+    demux_t *p_demux = (demux_t *) p_handle->p_sys;
+    demux_sys_t *p_sys = p_demux->p_sys;
+    const ts_pat_t *p_pat = GetPID(p_demux->p_sys, 0)->u.p_pat;
+
+    while( p_section )
+    {
+        const uint8_t *p_data = p_section->p_payload_start;
+        size_t i_data = p_section->p_payload_end - p_section->p_payload_start;
+
+        if( i_data < (6U + 7 + 1) || p_data[2] != TS_ARIB_CDT_DATA_TYPE_LOGO )
+            continue;
+
+        uint16_t i_onid = (p_data[0] << 8) | p_data[1];
+        uint16_t i_dr_len = ((p_data[3] & 0x0F) << 4) | p_data[4];
+        if( i_data < i_dr_len + (6U + 7 + 1) )
+            continue;
+
+        /* STD-B21 A.5.4 (Japanese spec only) */
+
+        const uint8_t *p_dmb = &p_data[5 + i_dr_len];
+        size_t i_dmb = i_data - 5 - i_dr_len;
+
+        while( i_dmb > 7 )
+        {
+            uint8_t i_logo_type = p_dmb[0];
+            uint16_t i_logo_id = ((p_dmb[1] & 0x01) << 8) | p_dmb[2];
+            uint16_t i_size = (p_dmb[5] << 8) | p_dmb[6];
+
+            if( 7U + i_size > i_dmb )
+                break;
+
+            for( int i=0; i<p_pat->programs.i_size; i++ )
+            {
+                ts_pmt_t *p_pmt = p_pat->programs.p_elems[i]->u.p_pmt;
+                if( p_pmt->arib.i_logo_id == i_logo_id && i_logo_type == TS_ARIB_LOGO_TYPE_HD_LARGE )
+                {
+                    char *psz_name;
+                    if( asprintf( &psz_name, "onid[%"PRIx16"]_channel_logo_id[%"PRIx16"]q[%d]",
+                                  i_onid, i_logo_id, i_logo_type ) > -1 )
+                    {
+                        uint8_t *p_png; size_t i_png;
+                        if( !vlc_dictionary_has_key( &p_sys->attachments, psz_name ) &&
+                            ts_arib_inject_png_palette( &p_dmb[7], i_size, &p_png, &i_png ) )
+                        {
+                            input_attachment_t *p_att = vlc_input_attachment_New(
+                                                        psz_name, "image/png", NULL, p_png, i_png );
+                            if( p_att )
+                            {
+                                vlc_dictionary_insert( &p_sys->attachments, psz_name, p_att );
+                                p_demux->info.i_update |= INPUT_UPDATE_META;
+                            }
+                            free( p_png );
+                        }
+                        free( psz_name );
+                    }
+                }
+            }
+
+            i_dmb -= 7 + i_size;
+            p_dmb += 7 + i_size;
+        }
+
+        p_section = p_section->p_next;
+    }
+}
+
 static void SINewTableCallBack( dvbpsi_t *h, uint8_t i_table_id,
                                 uint16_t i_extension, void *p_pid_cbdata )
 {
@@ -639,6 +753,12 @@ static void SINewTableCallBack( dvbpsi_t *h, uint8_t i_table_id,
         if( !dvbpsi_tot_attach( h, i_table_id, i_extension, (dvbpsi_tot_callback)TDTCallBack, p_demux ) )
             msg_Err( p_demux, "SINewTableCallback: failed attaching TDTCallback" );
     }
+    else if( p_pid->i_pid == TS_ARIB_CDT_PID && i_table_id == TS_ARIB_CDT_TABLE_ID )
+    {
+        if( dvbpsi_demuxGetSubDec( (dvbpsi_demux_t *) h->p_decoder, i_table_id, i_extension ) == NULL &&
+            !ts_dvbpsi_AttachRawSubDecoder( h, i_table_id, i_extension, ARIB_CDT_RawCallback, p_pid ) )
+            msg_Err( p_demux, "SINewTableCallback: failed attaching ARIB_CDT_RawCallback" );
+    }
 }
 
 bool ts_attach_SI_Tables_Decoders( ts_pid_t *p_pid )
diff --git a/modules/demux/mpeg/ts_streams.c b/modules/demux/mpeg/ts_streams.c
index 3b86e7e7e7..9b5ec2d8d9 100644
--- a/modules/demux/mpeg/ts_streams.c
+++ b/modules/demux/mpeg/ts_streams.c
@@ -40,6 +40,7 @@
 #include <vlc_demux.h>
 #include <vlc_es.h>
 #include <vlc_es_out.h>
+#include <vlc_input.h>
 
 #include "sections.h"
 #include "ts_pid.h"
@@ -137,6 +138,9 @@ ts_pmt_t *ts_pmt_New( demux_t *p_demux )
     pmt->eit.i_event_length = 0;
     pmt->eit.i_event_start = 0;
 
+    pmt->arib.i_download_id = -1;
+    pmt->arib.i_logo_id = -1;
+
     return pmt;
 }
 
@@ -159,6 +163,7 @@ void ts_pmt_Del( demux_t *p_demux, ts_pmt_t *pmt )
     ARRAY_RESET( pmt->od.objects );
     if( pmt->i_number > -1 )
         es_out_Control( p_demux->out, ES_OUT_DEL_GROUP, pmt->i_number );
+
     free( pmt );
 }
 
@@ -324,6 +329,7 @@ ts_si_t *ts_si_New( demux_t *p_demux )
     si->i_version  = -1;
     si->eitpid = NULL;
     si->tdtpid = NULL;
+    si->cdtpid = NULL;
 
     return si;
 }
@@ -337,6 +343,8 @@ void ts_si_Del( demux_t *p_demux, ts_si_t *si )
         PIDRelease( p_demux, si->eitpid );
     if( si->tdtpid )
         PIDRelease( p_demux, si->tdtpid );
+    if( si->cdtpid )
+        PIDRelease( p_demux, si->cdtpid );
     free( si );
 }
 
diff --git a/modules/demux/mpeg/ts_streams_private.h b/modules/demux/mpeg/ts_streams_private.h
index 29642531af..d1bfe3e8f8 100644
--- a/modules/demux/mpeg/ts_streams_private.h
+++ b/modules/demux/mpeg/ts_streams_private.h
@@ -74,6 +74,12 @@ struct ts_pmt_t
     mtime_t i_last_dts;
     uint64_t i_last_dts_byte;
 
+    /* ARIB specific */
+    struct
+    {
+        int i_logo_id;
+        int i_download_id;
+    } arib;
 };
 
 struct ts_es_t
@@ -141,6 +147,7 @@ struct ts_si_t
     /* Track successfully set pid */
     ts_pid_t *eitpid;
     ts_pid_t *tdtpid;
+    ts_pid_t *cdtpid;
 };
 
 typedef struct ts_psip_context_t ts_psip_context_t;



More information about the vlc-commits mailing list