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