Changeset fb0991c4183d6399b021e4baf1b4d3cf1c9e1763

Show
Ignore:
Timestamp:
18/07/06 10:48:53 (2 years ago)
Author:
Sigmund Augdal Helberg <sigmunau@videolan.org>
git-committer:
Sigmund Augdal Helberg <sigmunau@videolan.org> 1153212533 +0000
git-parent:

[665d0ef43005bd1073b995d1a91516109d2906fe]

git-author:
Sigmund Augdal Helberg <sigmunau@videolan.org> 1153212533 +0000
Message:

support muxing and demuxing of dual mono mpeg ts streams if libdvbpsi is up to date

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • include/vlc_es.h

    r2cb472d rfb0991c  
    157157                                        when no other stream 
    158158                                    >=0: priority */ 
     159 
    159160    char            *psz_language; 
    160161    char            *psz_description; 
    161  
     162    int             i_extra_languages; 
     163    struct { 
     164        char *psz_language; 
     165        char *psz_description; 
     166    } *p_extra_languages; 
     167     
    162168    audio_format_t audio; 
    163169    video_format_t video; 
     
    191197    fmt->psz_description        = NULL; 
    192198 
     199    fmt->i_extra_languages      = 0; 
     200    fmt->p_extra_languages      = NULL;     
     201 
    193202    memset( &fmt->audio, 0, sizeof(audio_format_t) ); 
    194203    memset( &fmt->video, 0, sizeof(video_format_t) ); 
     
    203212static inline void es_format_Copy( es_format_t *dst, es_format_t *src ) 
    204213{ 
     214    int i; 
    205215    memcpy( dst, src, sizeof( es_format_t ) ); 
    206216    if( src->psz_language ) 
     
    230240                sizeof( video_palette_t ) ); 
    231241    } 
     242 
     243    dst->i_extra_languages = src->i_extra_languages; 
     244    dst->p_extra_languages = malloc( dst->i_extra_languages * sizeof(*dst->p_extra_languages ) ); 
     245    for( i = 0; i < dst->i_extra_languages; i++ ) { 
     246        if( src->p_extra_languages[i].psz_language ) 
     247            dst->p_extra_languages[i].psz_language = strdup(src->p_extra_languages[i].psz_language); 
     248        else 
     249            dst->p_extra_languages[i].psz_language = NULL; 
     250        if( src->p_extra_languages[i].psz_description ) 
     251            dst->p_extra_languages[i].psz_description = strdup(src->p_extra_languages[i].psz_description); 
     252        else 
     253            dst->p_extra_languages[i].psz_description = NULL; 
     254    } 
    232255} 
    233256 
     
    248271    if( fmt->subs.psz_encoding ) free( fmt->subs.psz_encoding ); 
    249272    fmt->subs.psz_encoding = NULL; 
     273 
     274    if( fmt->i_extra_languages && fmt->p_extra_languages ) { 
     275        int i = 0; 
     276        while( i < fmt->i_extra_languages ) { 
     277            if( fmt->p_extra_languages[i].psz_language ) 
     278                free( fmt->p_extra_languages[i].psz_language ); 
     279            if( fmt->p_extra_languages[i].psz_description ) 
     280                free( fmt->p_extra_languages[i].psz_description ); 
     281            i++; 
     282        } 
     283        free(fmt->p_extra_languages); 
     284    } 
    250285} 
    251286 
  • modules/demux/ts.c

    r5e2c9b5 rfb0991c  
    31233123                if( p_decoded ) 
    31243124                { 
     3125#if DR_0A_API_VER >= 2 
     3126                    pid->es->fmt.psz_language = malloc( 4 ); 
     3127                    memcpy( pid->es->fmt.psz_language, 
     3128                            p_decoded->code[0].iso_639_code, 3 ); 
     3129                    pid->es->fmt.psz_language[3] = 0; 
     3130                    msg_Dbg( p_demux, "found language: %s", pid->es->fmt.psz_language); 
     3131                    switch( p_decoded->code[0].i_audio_type ) { 
     3132                    case 0: 
     3133                        pid->es->fmt.psz_description = NULL; 
     3134                        break; 
     3135                    case 1: 
     3136                        pid->es->fmt.psz_description = 
     3137                            strdup(_("clean effects")); 
     3138                        break; 
     3139                    case 2: 
     3140                        pid->es->fmt.psz_description = 
     3141                            strdup(_("hearing impaired")); 
     3142                        break; 
     3143                    case 3: 
     3144                        pid->es->fmt.psz_description = 
     3145                            strdup(_("visual impaired commentary")); 
     3146                        break; 
     3147                    default: 
     3148                        msg_Dbg( p_demux, "unknown audio type: %d", 
     3149                                 p_decoded->code[0].i_audio_type); 
     3150                        pid->es->fmt.psz_description = NULL; 
     3151                        break; 
     3152                    } 
     3153                    pid->es->fmt.i_extra_languages = p_decoded->i_code_count-1; 
     3154                    pid->es->fmt.p_extra_languages = 
     3155                        malloc( sizeof(*pid->es->fmt.p_extra_languages) * 
     3156                                pid->es->fmt.i_extra_languages ); 
     3157                    for( i = 0; i < pid->es->fmt.i_extra_languages; i++ ) { 
     3158                        msg_Dbg( p_demux, "bang" ); 
     3159                        pid->es->fmt.p_extra_languages[i].psz_language = 
     3160                            malloc(4); 
     3161                        memcpy(pid->es->fmt.p_extra_languages[i].psz_language, 
     3162                               p_decoded->code[i+1].iso_639_code, 3 ); 
     3163                        pid->es->fmt.p_extra_languages[i].psz_language[3] = '\0'; 
     3164                        switch( p_decoded->code[i].i_audio_type ) { 
     3165                        case 0: 
     3166                            pid->es->fmt.p_extra_languages[i].psz_description = 
     3167                                NULL; 
     3168                            break; 
     3169                        case 1: 
     3170                            pid->es->fmt.p_extra_languages[i].psz_description = 
     3171                                strdup(_("clean effects")); 
     3172                            break; 
     3173                        case 2: 
     3174                            pid->es->fmt.p_extra_languages[i].psz_description = 
     3175                                strdup(_("hearing impaired")); 
     3176                            break; 
     3177                        case 3: 
     3178                            pid->es->fmt.p_extra_languages[i].psz_description = 
     3179                                strdup(_("visual impaired commentary")); 
     3180                            break; 
     3181                        default: 
     3182                            msg_Dbg( p_demux, "unknown audio type: %d", 
     3183                                     p_decoded->code[i].i_audio_type); 
     3184                            pid->es->fmt.psz_description = NULL; 
     3185                            break; 
     3186                        } 
     3187 
     3188                    } 
     3189#else 
    31253190                    pid->es->fmt.psz_language = malloc( 4 ); 
    31263191                    memcpy( pid->es->fmt.psz_language, 
    31273192                            p_decoded->i_iso_639_code, 3 ); 
    31283193                    pid->es->fmt.psz_language[3] = 0; 
     3194#endif 
    31293195                } 
    31303196            } 
  • modules/mux/mpeg/ts.c

    r0b0cc6d rfb0991c  
    338338 
    339339    /* language is iso639-2T */ 
    340     uint8_t         lang[3]; 
     340    int             i_langs; 
     341    uint8_t         *lang; 
    341342 
    342343    sout_buffer_chain_t chain_pes; 
     
    886887    sout_mux_sys_t      *p_sys = p_mux->p_sys; 
    887888    ts_stream_t         *p_stream; 
     889    int                  i; 
    888890 
    889891    p_input->p_sys = p_stream = malloc( sizeof( ts_stream_t ) ); 
     
    10141016    } 
    10151017 
     1018    p_stream->i_langs = 1+p_input->p_fmt->i_extra_languages; 
     1019    p_stream->lang = malloc(p_stream->i_langs*3); 
     1020    i = 1; 
    10161021    p_stream->lang[0] = 
    10171022    p_stream->lang[1] = 
     
    10411046 
    10421047            msg_Dbg( p_mux, "    - lang=%c%c%c", 
    1043                      p_stream->lang[0], p_stream->lang[1], p_stream->lang[2] ); 
    1044         } 
     1048                     p_stream->lang[0], p_stream->lang[1], 
     1049                     p_stream->lang[2] ); 
     1050        } 
     1051    } 
     1052    while( i < p_stream->i_langs ) { 
     1053        if( p_input->p_fmt->p_extra_languages[i-1].psz_language ) 
     1054        { 
     1055            char *psz = p_input->p_fmt->p_extra_languages[i-1].psz_language; 
     1056            const iso639_lang_t *pl = NULL; 
     1057             
     1058            if( strlen( psz ) == 2 ) 
     1059            { 
     1060                pl = GetLang_1( psz ); 
     1061            } 
     1062            else if( strlen( psz ) == 3 ) 
     1063            { 
     1064                pl = GetLang_2B( psz ); 
     1065                if( !strcmp( pl->psz_iso639_1, "??" ) ) 
     1066                { 
     1067                    pl = GetLang_2T( psz ); 
     1068                } 
     1069            } 
     1070            if( pl && strcmp( pl->psz_iso639_1, "??" ) ) 
     1071            { 
     1072                p_stream->lang[i*3+0] = pl->psz_iso639_2T[0]; 
     1073                p_stream->lang[i*3+1] = pl->psz_iso639_2T[1]; 
     1074                p_stream->lang[i*3+2] = pl->psz_iso639_2T[2]; 
     1075                 
     1076                msg_Dbg( p_mux, "    - lang=%c%c%c", 
     1077                         p_stream->lang[i*3+0], p_stream->lang[i*3+1], 
     1078                         p_stream->lang[i*3+2] ); 
     1079            } 
     1080        } 
     1081        i++; 
    10451082    } 
    10461083 
     
    11841221    BufferChainClean( p_mux->p_sout, &p_stream->chain_pes ); 
    11851222 
     1223    if( p_stream->lang ) 
     1224    { 
     1225        free(p_stream->lang); 
     1226    } 
    11861227    if( p_stream->p_decoder_specific_info ) 
    11871228    { 
     
    24862527        if( p_stream->lang[0] != 0 ) 
    24872528        { 
    2488             uint8_t data[4]; 
     2529            uint8_t data[4*p_stream->i_langs]; 
    24892530 
    24902531            /* I construct the content myself, way faster than looking at 
    24912532             * over complicated/mind broken libdvbpsi way */ 
    2492             data[0] = p_stream->lang[0]; 
    2493             data[1] = p_stream->lang[1]; 
    2494             data[2] = p_stream->lang[2]; 
    2495             data[3] = 0x00; /* audio type: 0x00 undefined */ 
    2496  
    2497             dvbpsi_PMTESAddDescriptor( p_es, 0x0a, 4, data ); 
     2533            for(i = 0; i < p_stream->i_langs; i++ ) 
     2534            { 
     2535                data[i*4+0] = p_stream->lang[i*3+0]; 
     2536                data[i*4+1] = p_stream->lang[i*3+1]; 
     2537                data[i*4+2] = p_stream->lang[i*3+2]; 
     2538                data[i*4+3] = 0x00; /* audio type: 0x00 undefined */ 
     2539            } 
     2540            dvbpsi_PMTESAddDescriptor( p_es, 0x0a, 4*p_stream->i_langs, data ); 
    24982541        } 
    24992542    }