+static void PMTSetupEs0xA0( demux_t *p_demux, ts_pid_t *pid,
+ const dvbpsi_pmt_es_t *p_es )
+{
+ /* MSCODEC sent by vlc */
+ dvbpsi_descriptor_t *p_dr = PMTEsFindDescriptor( p_es, 0xa0 );
+ if( !p_dr || p_dr->i_length < 10 )
+ {
+ msg_Warn( p_demux,
+ "private MSCODEC (vlc) without bih private descriptor" );
+ return;
+ }
+
+ es_format_t *p_fmt = &pid->es->fmt;
+ p_fmt->i_cat = VIDEO_ES;
+ p_fmt->i_codec = VLC_FOURCC( p_dr->p_data[0], p_dr->p_data[1],
+ p_dr->p_data[2], p_dr->p_data[3] );
+ p_fmt->video.i_width = GetWBE( &p_dr->p_data[4] );
+ p_fmt->video.i_height = GetWBE( &p_dr->p_data[6] );
+ p_fmt->i_extra = GetWBE( &p_dr->p_data[8] );
+
+ if( p_fmt->i_extra > 0 )
+ {
+ p_fmt->p_extra = malloc( p_fmt->i_extra );
+ if( p_fmt->p_extra )
+ memcpy( p_fmt->p_extra, &p_dr->p_data[10],
+ __MIN( p_fmt->i_extra, p_dr->i_length - 10 ) );
+ else
+ p_fmt->i_extra = 0;
+ }
+ /* For such stream we will gather them ourself and don't launch a
+ * packetizer.
+ * Yes it's ugly but it's the only way to have DIV3 working */
+ p_fmt->b_packetized = true;
+}
+
+static void PMTSetupEsHDMV( demux_t *p_demux, ts_pid_t *pid,
+ const dvbpsi_pmt_es_t *p_es )
+{
+ es_format_t *p_fmt = &pid->es->fmt;
+
+ /* Blu-Ray mapping */
+ switch( p_es->i_type )
+ {
+ case 0x80:
+ p_fmt->i_cat = AUDIO_ES;
+ p_fmt->i_codec = VLC_FOURCC( 'b', 'p', 'c', 'm' );
+ break;
+ case 0x82:
+ case 0x85: /* DTS-HD High resolution audio */
+ case 0x86: /* DTS-HD Master audio */
+ case 0xA2: /* Secondary DTS audio */
+ p_fmt->i_cat = AUDIO_ES;
+ p_fmt->i_codec = VLC_FOURCC( 'd', 't', 's', ' ' );
+ break;
+
+ case 0x83: /* TrueHD AC3 */
+ p_fmt->i_cat = AUDIO_ES;
+ p_fmt->i_codec = VLC_FOURCC( 'm', 'l', 'p', ' ' );
+ break;
+
+ case 0x84: /* E-AC3 */
+ case 0x87: /* E-AC3 */
+ case 0xA1: /* Secondary E-AC3 */
+ p_fmt->i_cat = AUDIO_ES;
+ p_fmt->i_codec = VLC_FOURCC( 'e', 'a', 'c', '3' );
+ break;
+ case 0x90: /* Presentation graphics */
+ case 0x91: /* Interactive graphics */
+ case 0x92: /* Subtitle */
+ default:
+ break;
+ }
+}
+static void PMTParseEsIso639( demux_t *p_demux, ts_pid_t *pid,
+ const dvbpsi_pmt_es_t *p_es )
+{
+ /* get language descriptor */
+ dvbpsi_descriptor_t *p_dr = PMTEsFindDescriptor( p_es, 0x0a );
+
+ if( !p_dr )
+ return;
+
+ dvbpsi_iso639_dr_t *p_decoded = dvbpsi_DecodeISO639Dr( p_dr );
+ if( !p_decoded )
+ {
+ msg_Err( p_demux, "Failed to decode a ISO 639 descriptor" );
+ return;
+ }
+
+#if defined(DR_0A_API_VER) && (DR_0A_API_VER >= 2)
+ pid->es->fmt.psz_language = malloc( 4 );
+ if( pid->es->fmt.psz_language )
+ {
+ memcpy( pid->es->fmt.psz_language,
+ p_decoded->code[0].iso_639_code, 3 );
+ pid->es->fmt.psz_language[3] = 0;
+ msg_Dbg( p_demux, "found language: %s", pid->es->fmt.psz_language);
+ }
+ switch( p_decoded->code[0].i_audio_type )
+ {
+ case 0:
+ pid->es->fmt.psz_description = NULL;
+ break;
+ case 1:
+ pid->es->fmt.psz_description =
+ strdup(_("clean effects"));
+ break;
+ case 2:
+ pid->es->fmt.psz_description =
+ strdup(_("hearing impaired"));
+ break;
+ case 3:
+ pid->es->fmt.psz_description =
+ strdup(_("visual impaired commentary"));
+ break;
+ default:
+ msg_Dbg( p_demux, "unknown audio type: %d",
+ p_decoded->code[0].i_audio_type);
+ pid->es->fmt.psz_description = NULL;
+ break;
+ }
+ pid->es->fmt.i_extra_languages = p_decoded->i_code_count-1;
+ if( pid->es->fmt.i_extra_languages > 0 )
+ pid->es->fmt.p_extra_languages =
+ malloc( sizeof(*pid->es->fmt.p_extra_languages) *
+ pid->es->fmt.i_extra_languages );
+ if( pid->es->fmt.p_extra_languages )
+ {
+ for( int i = 0; i < pid->es->fmt.i_extra_languages; i++ )
+ {
+ msg_Dbg( p_demux, "bang" );
+ pid->es->fmt.p_extra_languages[i].psz_language =
+ malloc(4);
+ if( pid->es->fmt.p_extra_languages[i].psz_language )
+ {
+ memcpy( pid->es->fmt.p_extra_languages[i].psz_language,
+ p_decoded->code[i+1].iso_639_code, 3 );
+ pid->es->fmt.p_extra_languages[i].psz_language[3] = '\0';
+ }
+ switch( p_decoded->code[i].i_audio_type )
+ {
+ case 0:
+ pid->es->fmt.p_extra_languages[i].psz_description =
+ NULL;
+ break;
+ case 1:
+ pid->es->fmt.p_extra_languages[i].psz_description =
+ strdup(_("clean effects"));
+ break;
+ case 2:
+ pid->es->fmt.p_extra_languages[i].psz_description =
+ strdup(_("hearing impaired"));
+ break;
+ case 3:
+ pid->es->fmt.p_extra_languages[i].psz_description =
+ strdup(_("visual impaired commentary"));
+ break;
+ default:
+ msg_Dbg( p_demux, "unknown audio type: %d",
+ p_decoded->code[i].i_audio_type);
+ pid->es->fmt.psz_description = NULL;
+ break;