Changeset e5fe2b341fad70233788ceb83533c8d1a5a91d87

Show
Ignore:
Timestamp:
29/08/03 03:11:43 (5 years ago)
Author:
Laurent Aimar <fenrir@videolan.org>
git-committer:
Laurent Aimar <fenrir@videolan.org> 1062119503 +0000
git-parent:

[6c7682e327bb10893077397ab545c9f96dc8c221]

git-author:
Laurent Aimar <fenrir@videolan.org> 1062119503 +0000
Message:
  • asf: added stream infos object and fix a bug in packetization.
    -> it seems that WMP plays it without problem :))) (tested with DIV3+mp3)
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • modules/mux/asf.c

    r92a149b re5fe2b3  
    33 ***************************************************************************** 
    44 * Copyright (C) 2003 VideoLAN 
    5  * $Id: asf.c,v 1.5 2003/08/26 23:14:11 fenrir Exp $ 
     5 * $Id: asf.c,v 1.6 2003/08/29 01:11:43 fenrir Exp $ 
    66 * 
    77 * Authors: Laurent Aimar <fenrir@via.ecp.fr> 
     
    6565typedef struct 
    6666{ 
    67     int     i_id; 
    68     int     i_cat; 
    69     int     i_sequence; 
    70  
    71     int     i_extra; 
    72     uint8_t *p_extra; 
     67    int          i_id; 
     68    int          i_cat; 
     69 
     70    /* codec informations */ 
     71    uint16_t     i_tag;     /* for audio */ 
     72    vlc_fourcc_t i_fourcc;  /* for video */ 
     73    char         *psz_name; /* codec name */ 
     74 
     75    int          i_sequence; 
     76 
     77    int          i_extra; 
     78    uint8_t     *p_extra; 
    7379} asf_track_t; 
    7480 
     
    117123static void bo_add_mem  ( bo_t *, uint8_t *, int ); 
    118124 
     125static void bo_addle_str16( bo_t *, char * ); 
    119126 
    120127/***************************************************************************** 
     
    238245        case AUDIO_ES: 
    239246        { 
    240             uint16_t i_tag; 
    241247            int      i_blockalign = p_input->p_fmt->i_block_align; 
    242248            int      i_bitspersample = 0; 
     
    246252            { 
    247253                case VLC_FOURCC( 'a', '5', '2', ' ' ): 
    248                     i_tag = WAVE_FORMAT_A52; 
     254                    tk->i_tag = WAVE_FORMAT_A52; 
     255                    tk->psz_name = "A/52"; 
    249256                    break; 
    250257                case VLC_FOURCC( 'm', 'p', 'g', 'a' ): 
    251258#if 1 
    252                     i_tag = WAVE_FORMAT_MPEGLAYER3; 
     259                    tk->psz_name = "MPEG Audio Layer 3"; 
     260                    tk->i_tag = WAVE_FORMAT_MPEGLAYER3; 
    253261                    i_blockalign = 1; 
    254262                    i_extra = 12; 
    255263                    break; 
    256264#else 
    257                     i_tag = WAVE_FORMAT_MPEG; 
     265                    tk->psz_name = "MPEG Audio Layer 1/2"; 
     266                    tk->i_tag = WAVE_FORMAT_MPEG; 
    258267                    i_blockalign = 1; 
    259268                    i_extra = 22; 
     
    261270#endif 
    262271                case VLC_FOURCC( 'w', 'm', 'a', '1' ): 
    263                     i_tag = WAVE_FORMAT_WMA1; 
     272                    tk->psz_name = "Windows Media Audio 1"; 
     273                    tk->i_tag = WAVE_FORMAT_WMA1; 
    264274                    break; 
    265275                case VLC_FOURCC( 'w', 'm', 'a', '2' ): 
    266                     i_tag = WAVE_FORMAT_WMA2; 
     276                    tk->psz_name = "Windows Media Audio 2"; 
     277                    tk->i_tag = WAVE_FORMAT_WMA2; 
    267278                    break; 
    268279                case VLC_FOURCC( 'w', 'm', 'a', '3' ): 
    269                     i_tag = WAVE_FORMAT_WMA3; 
     280                    tk->psz_name = "Windows Media Audio 3"; 
     281                    tk->i_tag = WAVE_FORMAT_WMA3; 
    270282                    break; 
    271283                    /* raw codec */ 
    272284                case VLC_FOURCC( 'u', '8', ' ', ' ' ): 
    273                     i_tag = WAVE_FORMAT_PCM; 
     285                    tk->psz_name = "Raw audio 8bits"; 
     286                    tk->i_tag = WAVE_FORMAT_PCM; 
    274287                    i_blockalign= p_input->p_fmt->i_channels; 
    275288                    i_bitspersample = 8; 
    276289                    break; 
    277290                case VLC_FOURCC( 's', '1', '6', 'l' ): 
    278                     i_tag = WAVE_FORMAT_PCM; 
     291                    tk->psz_name = "Raw audio 16bits"; 
     292                    tk->i_tag = WAVE_FORMAT_PCM; 
    279293                    i_blockalign= 2 * p_input->p_fmt->i_channels; 
    280294                    i_bitspersample = 16; 
    281295                    break; 
    282296                case VLC_FOURCC( 's', '2', '4', 'l' ): 
    283                     i_tag = WAVE_FORMAT_PCM; 
     297                    tk->psz_name = "Raw audio 24bits"; 
     298                    tk->i_tag = WAVE_FORMAT_PCM; 
    284299                    i_blockalign= 3 * p_input->p_fmt->i_channels; 
    285300                    i_bitspersample = 24; 
    286301                    break; 
    287302                case VLC_FOURCC( 's', '3', '2', 'l' ): 
    288                     i_tag = WAVE_FORMAT_PCM; 
     303                    tk->psz_name = "Raw audio 32bits"; 
     304                    tk->i_tag = WAVE_FORMAT_PCM; 
    289305                    i_blockalign= 4 * p_input->p_fmt->i_channels; 
    290306                    i_bitspersample = 32; 
     
    294310            } 
    295311 
     312 
    296313            tk->i_extra = sizeof( WAVEFORMATEX ) + 
    297314                          p_input->p_fmt->i_extra_data + i_extra; 
    298315            tk->p_extra = malloc( tk->i_extra ); 
    299316            bo_init( &bo, tk->p_extra, tk->i_extra ); 
    300             bo_addle_u16( &bo, i_tag ); 
     317            bo_addle_u16( &bo, tk->i_tag ); 
    301318            bo_addle_u16( &bo, p_input->p_fmt->i_channels ); 
    302319            bo_addle_u32( &bo, p_input->p_fmt->i_sample_rate ); 
     
    313330            { 
    314331                bo_addle_u16( &bo, i_extra ); 
    315                 if( i_tag == WAVE_FORMAT_MPEGLAYER3 ) 
     332                if( tk->i_tag == WAVE_FORMAT_MPEGLAYER3 ) 
    316333                { 
    317334                    msg_Dbg( p_mux, "adding mp3 header" ); 
     
    322339                    bo_addle_u16( &bo, 1393 );  /* nCodecDelay */ 
    323340                } 
    324                 else if( i_tag == WAVE_FORMAT_MPEG ) 
     341                else if( tk->i_tag == WAVE_FORMAT_MPEG ) 
    325342                { 
    326343                    msg_Dbg( p_mux, "adding mp2 header" ); 
     
    365382            if( p_input->p_fmt->i_fourcc == VLC_FOURCC('m','p','4','v') ) 
    366383            { 
    367                 bo_add_mem( &bo, "MP4S", 4 ); 
     384                tk->psz_name = "MPEG-4 Video"; 
     385                tk->i_fourcc = VLC_FOURCC( 'M', 'P', '4', 'S' ); 
    368386            } 
    369387            else if( p_input->p_fmt->i_fourcc == VLC_FOURCC('D','I','V','3') ) 
    370388            { 
    371                 bo_add_mem( &bo, "MP43", 4 ); 
     389                tk->psz_name = "MSMPEG-4 V3 Video"; 
     390                tk->i_fourcc = VLC_FOURCC( 'M', 'P', '4', '3' ); 
    372391            } 
    373392            else if( p_input->p_fmt->i_fourcc == VLC_FOURCC('D','I','V','2') ) 
    374393            { 
    375                 bo_add_mem( &bo, "MP42", 4 ); 
     394                tk->psz_name = "MSMPEG-4 V2 Video"; 
     395                tk->i_fourcc = VLC_FOURCC( 'M', 'P', '4', '2' ); 
    376396            } 
    377397            else if( p_input->p_fmt->i_fourcc == VLC_FOURCC('D','I','V','1') ) 
    378398            { 
    379                 bo_add_mem( &bo, "MPG4", 4 ); 
     399                tk->psz_name = "MSMPEG-4 V1 Video"; 
     400                tk->i_fourcc = VLC_FOURCC( 'M', 'P', 'G', '4' ); 
     401            } 
     402            else if( p_input->p_fmt->i_fourcc == VLC_FOURCC('W','M','V','1') ) 
     403            { 
     404                tk->psz_name = "Windows Media Video 1"; 
     405                tk->i_fourcc = VLC_FOURCC( 'W', 'M', 'V', '1' ); 
     406            } 
     407            else if( p_input->p_fmt->i_fourcc == VLC_FOURCC('W','M','V','2') ) 
     408            { 
     409                tk->psz_name = "Windows Media Video 2"; 
     410                tk->i_fourcc = VLC_FOURCC( 'W', 'M', 'V', '2' ); 
    380411            } 
    381412            else 
    382413            { 
    383                 bo_add_mem( &bo, (uint8_t*)&p_input->p_fmt->i_fourcc, 4 ); 
    384             } 
     414                tk->psz_name = "Unknow Video"; 
     415                tk->i_fourcc = p_input->p_fmt->i_fourcc; 
     416            } 
     417            bo_add_mem( &bo, (uint8_t*)&tk->i_fourcc, 4 ); 
    385418            bo_addle_u32( &bo, 0 ); 
    386419            bo_addle_u32( &bo, 0 ); 
     
    568601} 
    569602 
     603static void bo_addle_str16( bo_t *bo, char *str ) 
     604{ 
     605    bo_addle_u16( bo, strlen( str ) + 1 ); 
     606    for( ;; ) 
     607    { 
     608        uint16_t c; 
     609 
     610        c = (uint8_t)*str++; 
     611        bo_addle_u16( bo, c ); 
     612        if( c == '\0' ) 
     613        { 
     614            break; 
     615        } 
     616    } 
     617} 
     618 
    570619/**************************************************************************** 
    571620 * guid 
     
    659708    { 0x8E, 0xE6,0x00, 0xC0, 0x0C ,0x20, 0x53, 0x65 } 
    660709}; 
     710static const guid_t asf_object_comment_guid = 
     711{ 
     712    0x86D15240, 
     713    0x311D, 
     714    0x11D0, 
     715    { 0xA3, 0xA4, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6 } 
     716}; 
     717static const guid_t asf_object_comment_reserved_guid = 
     718{ 
     719    0x86D15241, 
     720    0x311D, 
     721    0x11D0, 
     722    { 0xA3, 0xA4, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6 } 
     723}; 
    661724 
    662725static void asf_chunk_add( bo_t *bo, 
     
    678741    mtime_t        i_duration = 0; 
    679742    int i_size; 
     743    int i_ci_size; 
    680744    sout_buffer_t *out; 
    681745    bo_t          bo; 
     
    693757    /* calculate header size */ 
    694758    i_size = 30 + 104 + 46; 
     759    i_ci_size = 44; 
    695760    for( i = 1; i < p_sys->i_track; i++ ) 
    696761    { 
    697762        i_size += 78 + p_sys->track[i].i_extra; 
    698     } 
     763        i_ci_size += 8 + 2 * strlen( p_sys->track[i].psz_name ); 
     764        if( p_sys->track[i].i_cat == AUDIO_ES ) 
     765        { 
     766            i_ci_size += 4; 
     767        } 
     768        else if( p_sys->track[i].i_cat == VIDEO_ES ) 
     769        { 
     770            i_ci_size += 6; 
     771        } 
     772    } 
     773 
     774    i_size += i_ci_size; 
    699775 
    700776    if( p_sys->b_asf_http ) 
     
    766842    } 
    767843 
     844    /* Codec Infos */ 
     845    bo_add_guid ( &bo, &asf_object_comment_guid ); 
     846    bo_addle_u64( &bo, i_ci_size ); 
     847    bo_add_guid ( &bo, &asf_object_comment_reserved_guid ); 
     848    bo_addle_u32( &bo, p_sys->i_track - 1 ); 
     849    for( i = 1; i < p_sys->i_track; i++ ) 
     850    { 
     851        tk = &p_sys->track[i]; 
     852 
     853        bo_addle_u16( &bo, tk->i_id ); 
     854        bo_addle_str16( &bo, tk->psz_name ); 
     855        bo_addle_u16( &bo, 0 ); 
     856        if( tk->i_cat == AUDIO_ES ) 
     857        { 
     858            bo_addle_u16( &bo, 2 ); 
     859            bo_addle_u16( &bo, tk->i_tag ); 
     860        } 
     861        else if( tk->i_cat == VIDEO_ES ) 
     862        { 
     863            bo_addle_u16( &bo, 4 ); 
     864            bo_add_mem  ( &bo, (uint8_t*)&tk->i_fourcc, 4 ); 
     865 
     866        } 
     867    } 
     868 
    768869    /* data object */ 
    769870    bo_add_guid ( &bo, &asf_object_data_guid ); 
     
    825926        p_sys->i_pk_frame++; 
    826927 
    827         if( p_sys->i_pk_used + 14 >= p_sys->i_packet_size ) 
     928        if( p_sys->i_pk_used + 17 >= p_sys->i_packet_size ) 
    828929        { 
    829930            /* not enough data for another payload, flush the packet */