Changeset 009a1e8d2eca3a813d66aa1d067dd6def9eefd26

Show
Ignore:
Timestamp:
25/03/04 02:01:58 (5 years ago)
Author:
Laurent Aimar <fenrir@videolan.org>
git-committer:
Laurent Aimar <fenrir@videolan.org> 1080176518 +0000
git-parent:

[1f878728d314a9028a3a584b5b26a80e45a11b81]

git-author:
Laurent Aimar <fenrir@videolan.org> 1080176518 +0000
Message:
  • real: added support for aac codec.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • modules/demux/real.c

    ra54eb77 r009a1e8  
    447447    else if( tk->fmt.i_cat == AUDIO_ES && b_selected ) 
    448448    { 
    449         block_t *p_block = block_New( p_demux, i_size ); 
    450  
    451         if( tk->fmt.i_codec == VLC_FOURCC( 'a', '5', '2', ' ' ) ) 
    452         { 
    453             uint8_t *src = p_sys->buffer; 
    454             uint8_t *dst = p_block->p_buffer; 
    455  
    456             /* byte swap data */ 
    457             while( dst < &p_block->p_buffer[i_size- 1]) 
    458             { 
    459                 *dst++ = src[1]; 
    460                 *dst++ = src[0]; 
    461  
    462                 src += 2; 
     449        /* Set PCR */ 
     450        if( p_sys->i_pcr < i_pts ) 
     451        { 
     452            p_sys->i_pcr = i_pts; 
     453            es_out_Control( p_demux->out, ES_OUT_SET_PCR, (int64_t)p_sys->i_pcr ); 
     454        } 
     455 
     456        if( tk->fmt.i_codec == VLC_FOURCC( 'm', 'p', '4', 'a' ) ) 
     457        { 
     458            int     i_sub = (p_sys->buffer[1] >> 4)&0x0f; 
     459            uint8_t *p_sub = &p_sys->buffer[2+2*i_sub]; 
     460 
     461            int i; 
     462            for( i = 0; i < i_sub; i++ ) 
     463            { 
     464                int i_sub_size = GetWBE( &p_sys->buffer[2+i*2]); 
     465                block_t *p_block = block_New( p_demux, i_sub_size ); 
     466                if( p_block ) 
     467                { 
     468                    memcpy( p_block->p_buffer, p_sub, i_sub_size ); 
     469                    p_sub += i_sub_size; 
     470 
     471                    p_block->i_dts = 
     472                    p_block->i_pts = ( i == 0 ? i_pts : 0 ); 
     473 
     474                    es_out_Send( p_demux->out, tk->p_es, p_block ); 
     475                } 
    463476            } 
    464477        } 
    465478        else 
    466479        { 
    467             memcpy( p_block->p_buffer, p_sys->buffer, i_size ); 
    468         } 
    469         p_block->i_dts = 
    470         p_block->i_pts = i_pts; 
    471  
    472         if( p_sys->i_pcr < i_pts ) 
    473         { 
    474             p_sys->i_pcr = i_pts; 
    475  
    476             es_out_Control( p_demux->out, ES_OUT_SET_PCR, (int64_t)p_sys->i_pcr ); 
    477         } 
    478         es_out_Send( p_demux->out, tk->p_es, p_block ); 
     480            block_t *p_block = block_New( p_demux, i_size ); 
     481 
     482            if( tk->fmt.i_codec == VLC_FOURCC( 'a', '5', '2', ' ' ) ) 
     483            { 
     484                uint8_t *src = p_sys->buffer; 
     485                uint8_t *dst = p_block->p_buffer; 
     486 
     487                /* byte swap data */ 
     488                while( dst < &p_block->p_buffer[i_size- 1]) 
     489                { 
     490                    *dst++ = src[1]; 
     491                    *dst++ = src[0]; 
     492 
     493                    src += 2; 
     494                } 
     495            } 
     496            else 
     497            { 
     498                memcpy( p_block->p_buffer, p_sys->buffer, i_size ); 
     499            } 
     500            p_block->i_dts = 
     501            p_block->i_pts = i_pts; 
     502 
     503            es_out_Send( p_demux->out, tk->p_es, p_block ); 
     504        } 
    479505    } 
    480506 
     
    764790                    else if( !strncmp( p_peek, ".ra\xfd", 4 ) ) 
    765791                    { 
    766                         int i_version = GetWBE( &p_peek[4] ); 
     792                        int     i_version = GetWBE( &p_peek[4] ); 
     793                        uint8_t *p_extra = NULL; 
    767794                        msg_Dbg( p_demux, "    - audio version=%d", i_version ); 
    768795 
     
    780807                                    memcpy( &fmt.i_codec, &p_peek[57 + p_peek[56] + 1], 4 ); 
    781808                                } 
     809                                p_extra = &p_peek[57 + p_peek[56] + 1+ 4 + 3]; 
    782810                            } 
    783811                        } 
     
    787815                            fmt.audio.i_channels = GetWBE( &p_peek[60] ); 
    788816                            fmt.audio.i_rate = GetWBE( &p_peek[54] ); 
     817 
     818                            p_extra = &p_peek[66+4+3+1]; 
    789819                        } 
    790820                        msg_Dbg( p_demux, "    - audio codec=%4.4s channels=%d rate=%dHz", 
     
    792822                                fmt.audio.i_channels, fmt.audio.i_rate ); 
    793823 
    794                         if( !strncasecmp( (char*)&fmt.i_codec, "dnet", 4 ) ) 
     824                        if( fmt.i_codec == VLC_FOURCC( 'd', 'n', 'e', 't' ) ) 
    795825                        { 
    796826                            fmt.i_codec = VLC_FOURCC( 'a', '5', '2', ' ' ); 
     827                        } 
     828                        else if( fmt.i_codec == VLC_FOURCC( 'r', 'a', 'a', 'c' ) || 
     829                                 fmt.i_codec == VLC_FOURCC( 'r', 'a', 'c', 'p' ) ) 
     830                        { 
     831                            int i_peek = p_extra - p_peek; 
     832                            if( stream_Peek( p_demux->s, &p_peek, i_peek + 4 ) >= i_peek + 4 ) 
     833                            { 
     834                                int i_extra = GetDWBE( &p_peek[i_peek] ); 
     835 
     836                                if( i_extra > 1 && i_peek + 4 + i_extra <= i_len && 
     837                                    stream_Peek( p_demux->s, &p_peek, i_peek + 4 + i_extra ) >= i_peek + 4 + i_extra ) 
     838                                { 
     839                                    fmt.i_extra = i_extra - 1; 
     840                                    fmt.p_extra = malloc ( i_extra - 1 ); 
     841                                    memcpy( fmt.p_extra, &p_peek[i_peek+4+1], i_extra - 1 ); 
     842 
     843                                    msg_Dbg( p_demux, "        - extra data=%d", i_extra ); 
     844                                    { 
     845                                        int i; 
     846                                        for( i = 0; i < fmt.i_extra; i++ ) 
     847                                        { 
     848                                            msg_Dbg( p_demux, "          data[%d] = 0x%x", i,((uint8_t*)fmt.p_extra)[i] ); 
     849                                        } 
     850                                    } 
     851                                } 
     852                            } 
     853                            fmt.i_codec = VLC_FOURCC( 'm', 'p', '4', 'a' ); 
    797854                        } 
    798855