Changeset 00906ea88ec8bb008008fdfe6ce029249d3fd8bf

Show
Ignore:
Timestamp:
01/03/05 17:26:21 (4 years ago)
Author:
Gildas Bazin <gbazin@videolan.org>
git-committer:
Gildas Bazin <gbazin@videolan.org> 1109694381 +0000
git-parent:

[3c53e7b2030b2acbc072426d0ee7ab7b17822f0e]

git-author:
Gildas Bazin <gbazin@videolan.org> 1109694381 +0000
Message:

* modules/codec/lpcm.c: support for 20/24 bits LPCM.
* modules/audio_filter/converter/s16tofloat32*, modules/audio_filter/format.c: s24l/s24b conversion routines.

Files:

Legend:

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

    r17f16d7 r00906ea  
    22 * audio_output.h : audio output interface 
    33 ***************************************************************************** 
    4  * Copyright (C) 2002 VideoLAN 
     4 * Copyright (C) 2002-2005 VideoLAN 
    55 * $Id$ 
    66 * 
     
    4141#   define AOUT_FMT_S16_NE VLC_FOURCC('s','1','6','b') 
    4242#   define AOUT_FMT_U16_NE VLC_FOURCC('u','1','6','b') 
     43#   define AOUT_FMT_S24_NE VLC_FOURCC('s','2','4','b') 
    4344#else 
    4445#   define AOUT_FMT_S16_NE VLC_FOURCC('s','1','6','l') 
    4546#   define AOUT_FMT_U16_NE VLC_FOURCC('u','1','6','l') 
     47#   define AOUT_FMT_S24_NE VLC_FOURCC('s','2','4','l') 
    4648#endif 
    4749 
  • modules/audio_filter/converter/s16tofloat32.c

    ra90a19a r00906ea  
    22 * s16tofloat32.c : converter from signed 16 bits integer to float32 
    33 ***************************************************************************** 
    4  * Copyright (C) 2002 VideoLAN 
     4 * Copyright (C) 2002-2005 VideoLAN 
    55 * $Id$ 
    66 * 
     
    3939static void DoWork    ( aout_instance_t *, aout_filter_t *, aout_buffer_t *, 
    4040                        aout_buffer_t * ); 
     41static void DoWork24  ( aout_instance_t *, aout_filter_t *, aout_buffer_t *, 
     42                        aout_buffer_t * ); 
    4143 
    4244/***************************************************************************** 
     
    6062    aout_filter_t * p_filter = (aout_filter_t *)p_this; 
    6163 
    62     if ( p_filter->input.i_format != AOUT_FMT_S16_NE 
     64    if ( ( p_filter->input.i_format != AOUT_FMT_S16_NE && 
     65           p_filter->input.i_format != AOUT_FMT_S24_NE ) 
    6366          || p_filter->output.i_format != VLC_FOURCC('f','l','3','2') ) 
    6467    { 
     
    7174    } 
    7275 
    73     p_filter->pf_do_work = DoWork; 
     76    if( p_filter->input.i_format == AOUT_FMT_S24_NE ) 
     77        p_filter->pf_do_work = DoWork24; 
     78    else 
     79        p_filter->pf_do_work = DoWork; 
     80 
    7481    p_filter->b_in_place = VLC_TRUE; 
    7582 
     
    110117} 
    111118 
     119static void DoWork24( aout_instance_t * p_aout, aout_filter_t * p_filter, 
     120                      aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) 
     121{ 
     122    int i = p_in_buf->i_nb_samples * aout_FormatNbChannels( &p_filter->input ); 
     123 
     124    /* We start from the end because b_in_place is true */ 
     125    uint8_t * p_in = (uint8_t *)p_in_buf->p_buffer + (i - 1) * 3; 
     126    float * p_out = (float *)p_out_buf->p_buffer + i - 1; 
     127 
     128    while( i-- ) 
     129    { 
     130#ifdef WORDS_BIGENDIAN 
     131        *p_out = ((float)( (((int32_t)*(int16_t *)(p_in)) << 8) + p_in[2])) 
     132#else 
     133        *p_out = ((float)( (((int32_t)*(int16_t *)(p_in+1)) << 8) + p_in[0])) 
     134#endif 
     135            / 8388608.0; 
     136 
     137        p_in -= 3; p_out--; 
     138    } 
     139 
     140    p_out_buf->i_nb_samples = p_in_buf->i_nb_samples; 
     141    p_out_buf->i_nb_bytes = p_in_buf->i_nb_bytes * 4 / 3; 
     142} 
  • modules/audio_filter/converter/s16tofloat32swab.c

    ra90a19a r00906ea  
    33 *                      with endianness change 
    44 ***************************************************************************** 
    5  * Copyright (C) 2002 VideoLAN 
     5 * Copyright (C) 2002-2005 VideoLAN 
    66 * $Id$ 
    77 * 
     
    5050static void DoWork    ( aout_instance_t *, aout_filter_t *, aout_buffer_t *, 
    5151                        aout_buffer_t * ); 
     52static void DoWork24  ( aout_instance_t *, aout_filter_t *, aout_buffer_t *, 
     53                        aout_buffer_t * ); 
    5254 
    5355/***************************************************************************** 
     
    8385    { 
    8486        p_filter->pf_do_work = DoWork; 
     87        p_filter->b_in_place = VLC_TRUE; 
     88 
     89        return 0; 
     90    } 
     91 
     92    if ( (p_filter->input.i_format == VLC_FOURCC('s','2','4','l') || 
     93         p_filter->input.i_format == VLC_FOURCC('s','2','4','b')) 
     94         && p_filter->output.i_format == VLC_FOURCC('f','l','3','2') 
     95         && p_filter->input.i_format != AOUT_FMT_S24_NE ) 
     96    { 
     97        p_filter->pf_do_work = DoWork24; 
    8598        p_filter->b_in_place = VLC_TRUE; 
    8699 
     
    140153} 
    141154 
     155static void DoWork24( aout_instance_t * p_aout, aout_filter_t * p_filter, 
     156                      aout_buffer_t * p_in_buf, aout_buffer_t * p_out_buf ) 
     157{ 
     158    int i = p_in_buf->i_nb_samples * aout_FormatNbChannels( &p_filter->input ); 
     159 
     160    /* We start from the end because b_in_place is true */ 
     161    uint8_t * p_in = (uint8_t *)p_in_buf->p_buffer + (i - 1) * 3; 
     162    float * p_out = (float *)p_out_buf->p_buffer + i - 1; 
     163 
     164    byte_t p_tmp[3]; 
     165 
     166    while( i-- ) 
     167    { 
     168        p_tmp[0] = p_in[2]; 
     169        p_tmp[1] = p_in[1]; 
     170        p_tmp[2] = p_in[0]; 
     171 
     172#ifdef WORDS_BIGENDIAN 
     173        *p_out = ((float)( (((int32_t)*(int16_t *)(p_tmp)) << 8) + p_tmp[2])) 
     174#else 
     175        *p_out = ((float)( (((int32_t)*(int16_t *)(p_tmp+1)) << 8) + p_tmp[0])) 
     176#endif 
     177            / 8388608.0; 
     178 
     179        p_in -= 3; p_out--; 
     180    } 
     181 
     182    p_out_buf->i_nb_samples = p_in_buf->i_nb_samples; 
     183    p_out_buf->i_nb_bytes = p_in_buf->i_nb_bytes * 4 / 3; 
     184} 
  • modules/audio_filter/format.c

    ra4101b9 r00906ea  
    22 * format.c : PCM format converter 
    33 ***************************************************************************** 
    4  * Copyright (C) 2002 VideoLAN 
     4 * Copyright (C) 2002-2005 VideoLAN 
    55 * $Id$ 
    66 * 
     
    3434 
    3535#ifdef WORDS_BIGENDIAN 
     36#   define AOUT_FMT_S24_IE VLC_FOURCC('s','2','4','l') 
    3637#   define AOUT_FMT_S16_IE VLC_FOURCC('s','1','6','l') 
    3738#   define AOUT_FMT_U16_IE VLC_FOURCC('u','1','6','l') 
    3839#else 
     40#   define AOUT_FMT_S24_IE VLC_FOURCC('s','2','4','b') 
    3941#   define AOUT_FMT_S16_IE VLC_FOURCC('s','1','6','b') 
    4042#   define AOUT_FMT_U16_IE VLC_FOURCC('u','1','6','b') 
     
    4749static int  Open ( vlc_object_t * ); 
    4850 
     51static block_t *Float32toS24( filter_t *, block_t * ); 
    4952static block_t *Float32toS16( filter_t *, block_t * ); 
    5053static block_t *Float32toU16( filter_t *, block_t * ); 
     
    5255static block_t *Float32toU8 ( filter_t *, block_t * ); 
    5356 
    54 static block_t *S16toFloat32( filter_t *, block_t * ); 
    55 static block_t *S16toS8     ( filter_t *p_filter, block_t *p_block ); 
    56 static block_t *S16toU8     ( filter_t *p_filter, block_t *p_block ); 
    57 static block_t *S16toU16    ( filter_t *p_filter, block_t *p_block ); 
     57static block_t *S24toFloat32  ( filter_t *, block_t * ); 
     58static block_t *S24toS16      ( filter_t *, block_t * ); 
     59static block_t *S24toS16Invert( filter_t *, block_t * ); 
     60 
     61static block_t *S16toFloat32  ( filter_t *, block_t * ); 
     62static block_t *S16toS24      ( filter_t *, block_t * ); 
     63static block_t *S16toS24Invert( filter_t *, block_t * ); 
     64static block_t *S16toS8       ( filter_t *, block_t * ); 
     65static block_t *S16toU8       ( filter_t *, block_t * ); 
     66static block_t *S16toU16      ( filter_t *, block_t * ); 
    5867 
    5968static block_t *U16toFloat32( filter_t *, block_t * ); 
    60 static block_t *U16toS8     ( filter_t *p_filter, block_t *p_block ); 
    61 static block_t *U16toU8     ( filter_t *p_filter, block_t *p_block ); 
    62 static block_t *U16toS16    ( filter_t *p_filter, block_t *p_block ); 
    63  
     69static block_t *U16toS8     ( filter_t *, block_t * ); 
     70static block_t *U16toU8     ( filter_t *, block_t * ); 
     71static block_t *U16toS16    ( filter_t *, block_t * ); 
     72 
     73static block_t *Float32toS24Invert( filter_t *, block_t * ); 
    6474static block_t *Float32toS16Invert( filter_t *, block_t * ); 
    6575static block_t *Float32toU16Invert( filter_t *, block_t * ); 
    6676 
    67 static block_t *S16InverttoFloat32( filter_t *, block_t * ); 
    68 static block_t *S16InverttoS8( filter_t *p_filter, block_t *p_block ); 
    69 static block_t *S16InverttoU8( filter_t *p_filter, block_t *p_block ); 
    70 static block_t *S16InverttoU16( filter_t *p_filter, block_t *p_block ); 
     77static block_t *S24InverttoFloat32  ( filter_t *, block_t * ); 
     78static block_t *S24InverttoS16      ( filter_t *, block_t * ); 
     79static block_t *S24InverttoS16Invert( filter_t *, block_t * ); 
     80 
     81static block_t *S16InverttoFloat32  ( filter_t *, block_t * ); 
     82static block_t *S16InverttoS24      ( filter_t *, block_t * ); 
     83static block_t *S16InverttoS24Invert( filter_t *, block_t * ); 
     84static block_t *S16InverttoS8       ( filter_t *, block_t * ); 
     85static block_t *S16InverttoU8       ( filter_t *, block_t * ); 
     86static block_t *S16InverttoU16      ( filter_t *, block_t * ); 
    7187 
    7288static block_t *U16InverttoFloat32( filter_t *, block_t * ); 
    73 static block_t *U16InverttoS8( filter_t *p_filter, block_t *p_block ); 
    74 static block_t *U16InverttoU8( filter_t *p_filter, block_t *p_block ); 
    75 static block_t *U16InverttoS16( filter_t *p_filter, block_t *p_block ); 
    76  
    77 static block_t *S8toFloat32( filter_t *, block_t * ); 
    78 static block_t *S8toS16( filter_t *, block_t * ); 
    79 static block_t *S8toU16( filter_t *, block_t * ); 
    80 static block_t *S8toU8( filter_t *, block_t * ); 
     89static block_t *U16InverttoS8     ( filter_t *, block_t * ); 
     90static block_t *U16InverttoU8     ( filter_t *, block_t * ); 
     91static block_t *U16InverttoS16    ( filter_t *, block_t * ); 
     92 
     93static block_t *S8toFloat32  ( filter_t *, block_t * ); 
     94static block_t *S8toS16      ( filter_t *, block_t * ); 
     95static block_t *S8toU16      ( filter_t *, block_t * ); 
     96static block_t *S8toU8       ( filter_t *, block_t * ); 
    8197static block_t *S8toS16Invert( filter_t *, block_t * ); 
    8298static block_t *S8toU16Invert( filter_t *, block_t * ); 
    8399 
    84 static block_t *U8toFloat32( filter_t *, block_t * ); 
    85 static block_t *U8toFloat32( filter_t *, block_t * ); 
    86 static block_t *U8toS16( filter_t *, block_t * ); 
    87 static block_t *U8toU16( filter_t *, block_t * ); 
    88 static block_t *U8toS8( filter_t *, block_t * ); 
     100static block_t *U8toFloat32  ( filter_t *, block_t * ); 
     101static block_t *U8toFloat32  ( filter_t *, block_t * ); 
     102static block_t *U8toS16      ( filter_t *, block_t * ); 
     103static block_t *U8toU16      ( filter_t *, block_t * ); 
     104static block_t *U8toS8       ( filter_t *, block_t * ); 
    89105static block_t *U8toS16Invert( filter_t *, block_t * ); 
    90106static block_t *U8toU16Invert( filter_t *, block_t * ); 
     
    95111 
    96112 
    97 static block_t *Swap16   ( filter_t *, block_t * ); 
     113static block_t *Swap16( filter_t *, block_t * ); 
     114static block_t *Swap24( filter_t *, block_t * ); 
    98115 
    99116static struct 
     
    105122{ 
    106123    /* From fl32 */ 
     124    { VLC_FOURCC('f','l','3','2'), AOUT_FMT_S24_NE, Float32toS24 }, 
    107125    { VLC_FOURCC('f','l','3','2'), AOUT_FMT_S16_NE, Float32toS16 }, 
    108126    { VLC_FOURCC('f','l','3','2'), AOUT_FMT_U16_NE, Float32toU16 }, 
     127    { VLC_FOURCC('f','l','3','2'), AOUT_FMT_S24_IE, Float32toS24Invert }, 
    109128    { VLC_FOURCC('f','l','3','2'), AOUT_FMT_S16_IE, Float32toS16Invert }, 
    110129    { VLC_FOURCC('f','l','3','2'), AOUT_FMT_U16_IE, Float32toU16Invert }, 
     
    112131    { VLC_FOURCC('f','l','3','2'), VLC_FOURCC('u','8',' ',' '), Float32toU8 }, 
    113132 
     133    /* From s24 invert */ 
     134    { AOUT_FMT_S24_NE, VLC_FOURCC('f','l','3','2'), S24toFloat32 }, 
     135    { AOUT_FMT_S24_NE, AOUT_FMT_S24_IE,             Swap24 }, 
     136    { AOUT_FMT_S24_NE, AOUT_FMT_S16_NE,             S24toS16 }, 
     137    { AOUT_FMT_S24_NE, AOUT_FMT_S16_IE,             S24toS16Invert }, 
     138 
    114139    /* From s16 */ 
    115140    { AOUT_FMT_S16_NE, VLC_FOURCC('f','l','3','2'), S16toFloat32 }, 
    116     { AOUT_FMT_S16_NE, AOUT_FMT_S16_IE,            Swap16 }, 
    117     { AOUT_FMT_S16_NE, AOUT_FMT_U16_IE,            S16toU16 }, 
     141    { AOUT_FMT_S16_NE, AOUT_FMT_S24_NE,             S16toS24 }, 
     142    { AOUT_FMT_S16_NE, AOUT_FMT_S24_IE,             S16toS24Invert }, 
     143    { AOUT_FMT_S16_NE, AOUT_FMT_S16_IE,             Swap16 }, 
     144    { AOUT_FMT_S16_NE, AOUT_FMT_U16_IE,             S16toU16 }, 
    118145    { AOUT_FMT_S16_NE, VLC_FOURCC('s','8',' ',' '), S16toS8 }, 
    119146    { AOUT_FMT_S16_NE, VLC_FOURCC('u','8',' ',' '), S16toU8 }, 
     
    121148    /* From u16 */ 
    122149    { AOUT_FMT_U16_NE, VLC_FOURCC('f','l','3','2'), U16toFloat32 }, 
    123     { AOUT_FMT_U16_NE, AOUT_FMT_U16_IE,            Swap16 }, 
    124     { AOUT_FMT_U16_NE, AOUT_FMT_S16_IE,            U16toS16 }, 
     150    { AOUT_FMT_U16_NE, AOUT_FMT_U16_IE,            Swap16 }, 
     151    { AOUT_FMT_U16_NE, AOUT_FMT_S16_IE,            U16toS16 }, 
    125152    { AOUT_FMT_U16_NE, VLC_FOURCC('s','8',' ',' '), U16toS8 }, 
    126153    { AOUT_FMT_U16_NE, VLC_FOURCC('u','8',' ',' '), U16toU8 }, 
     
    142169    { VLC_FOURCC('u','8',' ',' '), VLC_FOURCC('s','8',' ',' '), U8toS8 }, 
    143170 
     171    /* From s24 invert */ 
     172    { AOUT_FMT_S24_IE, VLC_FOURCC('f','l','3','2'), S24InverttoFloat32 }, 
     173    { AOUT_FMT_S24_IE, AOUT_FMT_S24_NE,             Swap24 }, 
     174    { AOUT_FMT_S24_IE, AOUT_FMT_S16_NE,             S24InverttoS16 }, 
     175    { AOUT_FMT_S24_IE, AOUT_FMT_S16_IE,             S24InverttoS16Invert }, 
     176 
    144177    /* From s16 invert */ 
    145178    { AOUT_FMT_S16_IE, VLC_FOURCC('f','l','3','2'), S16InverttoFloat32 }, 
    146     { AOUT_FMT_S16_IE, AOUT_FMT_S16_NE,            Swap16 }, 
    147     { AOUT_FMT_S16_IE, AOUT_FMT_U16_NE,            S16InverttoU16 }, 
     179    { AOUT_FMT_S16_IE, AOUT_FMT_S24_NE,             S16InverttoS24 }, 
     180    { AOUT_FMT_S16_IE, AOUT_FMT_S24_IE,             S16InverttoS24Invert }, 
     181    { AOUT_FMT_S16_IE, AOUT_FMT_S16_NE,             Swap16 }, 
     182    { AOUT_FMT_S16_IE, AOUT_FMT_U16_NE,             S16InverttoU16 }, 
    148183    { AOUT_FMT_S16_IE, VLC_FOURCC('s','8',' ',' '), S16InverttoS8 }, 
    149184    { AOUT_FMT_S16_IE, VLC_FOURCC('u','8',' ',' '), S16InverttoU8 }, 
     
    151186    /* From u16 invert */ 
    152187    { AOUT_FMT_U16_IE, VLC_FOURCC('f','l','3','2'), U16InverttoFloat32 }, 
    153     { AOUT_FMT_U16_IE, AOUT_FMT_U16_NE,            Swap16 }, 
    154     { AOUT_FMT_U16_IE, AOUT_FMT_S16_NE,            U16InverttoS16 }, 
     188    { AOUT_FMT_U16_IE, AOUT_FMT_U16_NE,            Swap16 }, 
     189    { AOUT_FMT_U16_IE, AOUT_FMT_S16_NE,            U16InverttoS16 }, 
    155190    { AOUT_FMT_U16_IE, VLC_FOURCC('s','8',' ',' '), U16InverttoS8 }, 
    156191    { AOUT_FMT_U16_IE, VLC_FOURCC('u','8',' ',' '), U16InverttoU8 }, 
     
    200235 * Convert a buffer 
    201236 *****************************************************************************/ 
     237static block_t *Float32toS24( filter_t *p_filter, block_t *p_block ) 
     238{ 
     239    int i; 
     240    float *p_in = (float *)p_block->p_buffer; 
     241    uint8_t *p_out = (uint8_t *)p_in; 
     242    int32_t out; 
     243 
     244    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
     245    { 
     246        if ( *p_in >= 1.0 ) out = 8388607; 
     247        else if ( *p_in < -1.0 ) out = -8388608; 
     248        else out = *p_in * 8388608.0; 
     249 
     250#ifdef WORDS_BIGENDIAN 
     251    *((int16_t *)p_out) = out >> 8; 
     252    p_out[2] = out & 0xFF; 
     253#else 
     254    *((int16_t *)(p_out+1)) = out >> 8; 
     255    p_out[0] = out & 0xFF; 
     256#endif 
     257 
     258        p_in++; p_out += 3; 
     259    } 
     260 
     261    p_block->i_buffer = p_block->i_buffer * 3 / 4; 
     262    return p_block; 
     263} 
     264 
    202265static block_t *Float32toS16( filter_t *p_filter, block_t *p_block ) 
    203266{ 
     
    246309} 
    247310 
     311static block_t *S24toFloat32( filter_t *p_filter, block_t *p_block ) 
     312{ 
     313    block_t *p_block_out; 
     314    uint8_t *p_in; 
     315    float *p_out; 
     316    int i; 
     317 
     318    p_block_out = 
     319        p_filter->pf_audio_buffer_new( p_filter, p_block->i_buffer*4/3 ); 
     320    if( !p_block_out ) 
     321    { 
     322        msg_Warn( p_filter, "can't get output buffer" ); 
     323        return NULL; 
     324    } 
     325 
     326    p_in = p_block->p_buffer; 
     327    p_out = (float *)p_block_out->p_buffer; 
     328 
     329    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
     330    { 
     331#ifdef WORDS_BIGENDIAN 
     332        *p_out = ((float)( (((int32_t)*(int16_t *)(p_in)) << 8) + p_in[2])) 
     333#else 
     334        *p_out = ((float)( (((int32_t)*(int16_t *)(p_in+1)) << 8) + p_in[0])) 
     335#endif 
     336            / 8388608.0; 
     337 
     338        p_in += 3; p_out++; 
     339    } 
     340 
     341    p_block_out->i_samples = p_block->i_samples; 
     342    p_block_out->i_dts = p_block->i_dts; 
     343    p_block_out->i_pts = p_block->i_pts; 
     344    p_block_out->i_length = p_block->i_length; 
     345    p_block_out->i_rate = p_block->i_rate; 
     346 
     347    p_block->pf_release( p_block ); 
     348    return p_block_out; 
     349} 
     350 
     351static block_t *S24toS16( filter_t *p_filter, block_t *p_block ) 
     352{ 
     353    int i; 
     354    uint8_t *p_in = (uint8_t *)p_block->p_buffer; 
     355    uint8_t *p_out = (uint8_t *)p_in; 
     356 
     357    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
     358    { 
     359#ifdef WORDS_BIGENDIAN 
     360        *p_out++ = *p_in++; 
     361        *p_out++ = *p_in++; 
     362        p_in++; 
     363#else 
     364        p_in++; 
     365        *p_out++ = *p_in++; 
     366        *p_out++ = *p_in++; 
     367#endif 
     368    } 
     369 
     370    p_block->i_buffer = p_block->i_buffer * 2 / 3; 
     371    return p_block; 
     372} 
     373 
    248374static block_t *S16toFloat32( filter_t *p_filter, block_t *p_block ) 
    249375{ 
     
    324450} 
    325451 
    326 static block_t *S16toS8( filter_t *p_filter, block_t *p_block ) 
    327 
    328     int i; 
    329     int16_t *p_in = (int16_t *)p_block->p_buffer; 
    330     int8_t *p_out = (int8_t *)p_in; 
    331  
    332     for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
    333         *p_out++ = (*p_in++) >> 8; 
    334  
    335     p_block->i_buffer /= 2; 
    336     return p_block; 
    337 
    338 static block_t *S16toU8( filter_t *p_filter, block_t *p_block ) 
    339 
    340     int i; 
    341     int16_t *p_in = (int16_t *)p_block->p_buffer; 
    342     uint8_t *p_out = (uint8_t *)p_in; 
    343  
    344     for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
    345         *p_out++ = ((*p_in++) + 32768) >> 8; 
    346  
    347     p_block->i_buffer /= 2; 
    348     return p_block; 
    349 
    350 static block_t *S16toU16( filter_t *p_filter, block_t *p_block ) 
    351 
    352     int i; 
    353     int16_t *p_in = (int16_t *)p_block->p_buffer; 
    354     uint16_t *p_out = (uint16_t *)p_in; 
    355  
    356     for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
    357         *p_out++ = (*p_in++) + 32768; 
    358  
    359     return p_block; 
    360 
    361  
    362 static block_t *U16toS8( filter_t *p_filter, block_t *p_block ) 
    363 
    364     int i; 
    365     uint16_t *p_in = (uint16_t *)p_block->p_buffer; 
    366     int8_t *p_out = (int8_t *)p_in; 
    367  
    368     for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
    369         *p_out++ = ((int)(*p_in++) - 32768) >> 8; 
    370  
    371     p_block->i_buffer /= 2; 
    372     return p_block; 
    373 
    374 static block_t *U16toU8( filter_t *p_filter, block_t *p_block ) 
    375 
    376     int i; 
    377     uint16_t *p_in = (uint16_t *)p_block->p_buffer; 
    378     uint8_t *p_out = (uint8_t *)p_in; 
    379  
    380     for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
    381         *p_out++ = (*p_in++) >> 8; 
    382  
    383     p_block->i_buffer /= 2; 
    384     return p_block; 
    385 
    386 static block_t *U16toS16( filter_t *p_filter, block_t *p_block ) 
    387 
    388     int i; 
    389     int16_t *p_in = (int16_t *)p_block->p_buffer; 
    390     uint16_t *p_out = (uint16_t *)p_in; 
    391  
    392     for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
    393         *p_out++ = (int)(*p_in++) - 32768; 
    394  
    395     return p_block; 
    396 
    397  
    398 static block_t *S8toU8( filter_t *p_filter, block_t *p_block ) 
    399 
    400     int i; 
    401     int8_t *p_in = (int8_t *)p_block->p_buffer; 
    402     uint8_t *p_out = (uint8_t *)p_in; 
    403  
    404     for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
    405         *p_out++ = ((*p_in++) + 128); 
    406  
    407     return p_block; 
    408 
    409 static block_t *U8toS8( filter_t *p_filter, block_t *p_block ) 
    410 
    411     int i; 
    412     uint8_t *p_in = (uint8_t *)p_block->p_buffer; 
    413     int8_t *p_out = (int8_t *)p_in; 
    414  
    415     for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
    416         *p_out++ = ((*p_in++) - 128); 
    417  
    418     return p_block; 
    419 
    420  
    421 /* */ 
    422 static block_t *S8toU16( filter_t *p_filter, block_t *p_block ) 
     452static block_t *S16toS24( filter_t *p_filter, block_t *p_block ) 
    423453{ 
    424454    block_t *p_block_out; 
    425     int8_t *p_in; 
    426     uint16_t *p_out; 
     455    uint8_t *p_in, *p_out; 
    427456    int i; 
    428457 
    429458    p_block_out = 
    430         p_filter->pf_audio_buffer_new( p_filter, p_block->i_buffer*2 ); 
     459        p_filter->pf_audio_buffer_new( p_filter, p_block->i_buffer*3/2 ); 
    431460    if( !p_block_out ) 
    432461    { 
     
    435464    } 
    436465 
    437     p_in = (int8_t *)p_block->p_buffer; 
    438     p_out = (uint16_t *)p_block_out->p_buffer; 
    439  
    440     for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
    441         *p_out++ = ((*p_in++) + 128) << 8; 
     466    p_in = (uint8_t *)p_block->p_buffer; 
     467    p_out = (uint8_t *)p_block_out->p_buffer; 
     468 
     469    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
     470    { 
     471#ifdef WORDS_BIGENDIAN 
     472        *p_out++ = *p_in++; 
     473        *p_out++ = *p_in++; 
     474        *p_out++ = 0; 
     475#else 
     476        *p_out++ = 0; 
     477        *p_out++ = *p_in++; 
     478        *p_out++ = *p_in++; 
     479#endif 
     480    } 
    442481 
    443482    p_block_out->i_samples = p_block->i_samples; 
     
    451490} 
    452491 
    453 static block_t *U8toS16( filter_t *p_filter, block_t *p_block ) 
     492static block_t *S16toS8( filter_t *p_filter, block_t *p_block ) 
     493
     494    int i; 
     495    int16_t *p_in = (int16_t *)p_block->p_buffer; 
     496    int8_t *p_out = (int8_t *)p_in; 
     497 
     498    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
     499        *p_out++ = (*p_in++) >> 8; 
     500 
     501    p_block->i_buffer /= 2; 
     502    return p_block; 
     503
     504static block_t *S16toU8( filter_t *p_filter, block_t *p_block ) 
     505
     506    int i; 
     507    int16_t *p_in = (int16_t *)p_block->p_buffer; 
     508    uint8_t *p_out = (uint8_t *)p_in; 
     509 
     510    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
     511        *p_out++ = ((*p_in++) + 32768) >> 8; 
     512 
     513    p_block->i_buffer /= 2; 
     514    return p_block; 
     515
     516static block_t *S16toU16( filter_t *p_filter, block_t *p_block ) 
     517
     518    int i; 
     519    int16_t *p_in = (int16_t *)p_block->p_buffer; 
     520    uint16_t *p_out = (uint16_t *)p_in; 
     521 
     522    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
     523        *p_out++ = (*p_in++) + 32768; 
     524 
     525    return p_block; 
     526
     527 
     528static block_t *U16toS8( filter_t *p_filter, block_t *p_block ) 
     529
     530    int i; 
     531    uint16_t *p_in = (uint16_t *)p_block->p_buffer; 
     532    int8_t *p_out = (int8_t *)p_in; 
     533 
     534    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
     535        *p_out++ = ((int)(*p_in++) - 32768) >> 8; 
     536 
     537    p_block->i_buffer /= 2; 
     538    return p_block; 
     539
     540static block_t *U16toU8( filter_t *p_filter, block_t *p_block ) 
     541
     542    int i; 
     543    uint16_t *p_in = (uint16_t *)p_block->p_buffer; 
     544    uint8_t *p_out = (uint8_t *)p_in; 
     545 
     546    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
     547        *p_out++ = (*p_in++) >> 8; 
     548 
     549    p_block->i_buffer /= 2; 
     550    return p_block; 
     551
     552static block_t *U16toS16( filter_t *p_filter, block_t *p_block ) 
     553
     554    int i; 
     555    int16_t *p_in = (int16_t *)p_block->p_buffer; 
     556    uint16_t *p_out = (uint16_t *)p_in; 
     557 
     558    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
     559        *p_out++ = (int)(*p_in++) - 32768; 
     560 
     561    return p_block; 
     562
     563 
     564static block_t *S8toU8( filter_t *p_filter, block_t *p_block ) 
     565
     566    int i; 
     567    int8_t *p_in = (int8_t *)p_block->p_buffer; 
     568    uint8_t *p_out = (uint8_t *)p_in; 
     569 
     570    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
     571        *p_out++ = ((*p_in++) + 128); 
     572 
     573    return p_block; 
     574
     575static block_t *U8toS8( filter_t *p_filter, block_t *p_block ) 
     576
     577    int i; 
     578    uint8_t *p_in = (uint8_t *)p_block->p_buffer; 
     579    int8_t *p_out = (int8_t *)p_in; 
     580 
     581    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
     582        *p_out++ = ((*p_in++) - 128); 
     583 
     584    return p_block; 
     585
     586 
     587/* */ 
     588static block_t *S8toU16( filter_t *p_filter, block_t *p_block ) 
    454589{ 
    455590    block_t *p_block_out; 
    456     uint8_t *p_in; 
    457     int16_t *p_out; 
     591    int8_t *p_in; 
     592    uint16_t *p_out; 
    458593    int i; 
    459594 
     
    466601    } 
    467602 
    468     p_in = (uint8_t *)p_block->p_buffer; 
    469     p_out = (int16_t *)p_block_out->p_buffer; 
    470  
    471     for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
    472         *p_out++ = ((*p_in++) - 128) << 8; 
     603    p_in = (int8_t *)p_block->p_buffer; 
     604    p_out = (uint16_t *)p_block_out->p_buffer; 
     605 
     606    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
     607        *p_out++ = ((*p_in++) + 128) << 8; 
    473608 
    474609    p_block_out->i_samples = p_block->i_samples; 
     
    482617} 
    483618 
    484  
    485 static block_t *S8toS16( filter_t *p_filter, block_t *p_block ) 
     619static block_t *U8toS16( filter_t *p_filter, block_t *p_block ) 
    486620{ 
    487621    block_t *p_block_out; 
    488     int8_t *p_in; 
     622    uint8_t *p_in; 
    489623    int16_t *p_out; 
    490624    int i; 
     
    498632    } 
    499633 
    500     p_in = (int8_t *)p_block->p_buffer; 
     634    p_in = (uint8_t *)p_block->p_buffer; 
    501635    p_out = (int16_t *)p_block_out->p_buffer; 
    502636 
    503637    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
    504         *p_out++ = (*p_in++) << 8; 
     638        *p_out++ = ((*p_in++) - 128) << 8; 
    505639 
    506640    p_block_out->i_samples = p_block->i_samples; 
     
    514648} 
    515649 
    516 static block_t *U8toU16( filter_t *p_filter, block_t *p_block ) 
     650 
     651static block_t *S8toS16( filter_t *p_filter, block_t *p_block ) 
    517652{ 
    518653    block_t *p_block_out; 
    519     uint8_t *p_in; 
    520     uint16_t *p_out; 
     654    int8_t *p_in; 
     655    int16_t *p_out; 
    521656    int i; 
    522657 
     
    529664    } 
    530665 
    531     p_in = (uint8_t *)p_block->p_buffer; 
    532     p_out = (uint16_t *)p_block_out->p_buffer; 
     666    p_in = (int8_t *)p_block->p_buffer; 
     667    p_out = (int16_t *)p_block_out->p_buffer; 
    533668 
    534669    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
     
    545680} 
    546681 
     682static block_t *U8toU16( filter_t *p_filter, block_t *p_block ) 
     683{ 
     684    block_t *p_block_out; 
     685    uint8_t *p_in; 
     686    uint16_t *p_out; 
     687    int i; 
     688 
     689    p_block_out = 
     690        p_filter->pf_audio_buffer_new( p_filter, p_block->i_buffer*2 ); 
     691    if( !p_block_out ) 
     692    { 
     693        msg_Warn( p_filter, "can't get output buffer" ); 
     694        return NULL; 
     695    } 
     696 
     697    p_in = (uint8_t *)p_block->p_buffer; 
     698    p_out = (uint16_t *)p_block_out->p_buffer; 
     699 
     700    for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) 
     701        *p_out++ = (*p_in++) << 8; 
     702 
     703    p_block_out->i_samples = p_block->i_samples; 
     704    p_block_out->i_dts = p_block->i_dts; 
     705    p_block_out->i_pts = p_block->i_pts; 
     706    p_block_out->i_length = p_block->i_length; 
     707    p_block_out->i_rate = p_block->i_rate; 
     708 
     709    p_block->pf_release( p_block ); 
     710    return p_block_out; 
     711} 
     712 
    547713/***************************************************************************** 
    548  * Swap a buffer of word 
     714 * Swap a buffer of words 
    549715 *****************************************************************************/ 
    550716static block_t *Swap16( filter_t *p_filter, block_t *p_block ) 
     
    565731} 
    566732 
    567 #define CONVERT_NN( func, f_in, f_out, b_pre_invert, b_post_invert ) \ 
     733static block_t *Swap24( filter_t *p_filter, block_t *p_block ) 
     734
     735    int i; 
     736    uint8_t *p_in = (uint8_t *)p_block->p_buffer; 
     737    uint8_t tmp; 
     738 
     739    for( i = 0; i < p_block->i_buffer / 3; i++ ) 
     740    { 
     741        tmp = p_in[0]; 
     742        p_in[0] = p_in[2]; 
     743        p_in[2] = tmp; 
     744        p_in += 3; 
     745    } 
     746 
     747    return p_block; 
     748
     749 
     750#define CONVERT_NN( func, f_in, f_out, b_pre_invert, b_post_invert, swapa, swapb ) \ 
    568751static block_t *func( filter_t *p_filter, block_t *p_block ) \ 
    569752{                                                   \ 
    570753    if( b_pre_invert )                              \ 
    571         Swap16( p_filter, p_block );                \ 
     754        swapa( p_filter, p_block );                  \ 
    572755                                                    \ 
    573756    p_block = f_in##to##f_out( p_filter, p_block ); \ 
    574757                                                    \ 
    575758    if( b_post_invert )                             \ 
    576         Swap16( p_filter, p_block );                \ 
     759        swapb( p_filter, p_block );                  \ 
    577760                                                    \ 
    578761    return p_block;                                 \ 
    579762} 
    580763 
    581 CONVERT_NN( Float32toS16Invert, Float32, S16, 0, 1 ) 
    582 CONVERT_NN( Float32toU16Invert, Float32, U16, 0, 1 ) 
    583  
    584 CONVERT_NN( S16InverttoFloat32, S16, Float32, 1, 0 ) 
    585 CONVERT_NN( S16InverttoS8,      S16, S8,      1, 0 ) 
    586 CONVERT_NN( S16InverttoU8,      S16, U8,      1, 0 ) 
    587 CONVERT_NN( S16InverttoU16,     S16, U16,     1, 0 ) 
    588  
    589 CONVERT_NN( U16InverttoFloat32, U16, Float32, 1, 0 ) 
    590 CONVERT_NN( U16InverttoS8,      U16, S8,      1, 0 ) 
    591 CONVERT_NN( U16InverttoU8,      U16, U8,      1, 0 ) 
    592 CONVERT_NN( U16InverttoS16,     U16, S16,     1, 0 ) 
     764CONVERT_NN( Float32toS24Invert, Float32, S24, 0, 1, Swap24, Swap24 ) 
     765CONVERT_NN( Float32toS16Invert, Float32, S16, 0, 1, Swap16, Swap16 ) 
     766CONVERT_NN( Float32toU16Invert, Float32, U16, 0, 1, Swap16, Swap16 ) 
     767 
     768CONVERT_NN( S24InverttoFloat32, S24, Float32, 1, 0, Swap24, Swap24 ) 
     769CONVERT_NN( S24InverttoS16,     S24, S16,     1, 0, Swap24, Swap16 ) 
     770CONVERT_NN( S24InverttoS16Invert, S24, S16,   1, 1, Swap24, Swap16 ) 
     771CONVERT_NN( S24toS16Invert,     S24, S16,     0, 1, Swap24, Swap16 ) 
     772 
     773CONVERT_NN( S16InverttoFloat32, S16, Float32, 1, 0, Swap16, Swap16 ) 
     774CONVERT_NN( S16InverttoS24,     S16, S24,     1, 0, Swap16, Swap24 ) 
     775CONVERT_NN( S16toS24Invert,     S16, S24,     0, 1, Swap16, Swap24 ) 
     776CONVERT_NN( S16InverttoS24Invert, S16, S24,   1, 1, Swap16, Swap24 ) 
     777CONVERT_NN( S16InverttoS8,      S16, S8,      1, 0, Swap16, Swap16 ) 
     778CONVERT_NN( S16InverttoU8,      S16, U8,      1, 0, Swap16, Swap16 ) 
     779CONVERT_NN( S16InverttoU16,     S16, U16,     1, 0, Swap16, Swap16 ) 
     780 
     781CONVERT_NN( U16InverttoFloat32, U16, Float32, 1, 0, Swap16, Swap16 ) 
     782CONVERT_NN( U16InverttoS8,      U16, S8,      1, 0, Swap16, Swap16 ) 
     783CONVERT_NN( U16InverttoU8,      U16, U8,      1, 0, Swap16, Swap16 ) 
     784CONVERT_NN( U16InverttoS16,     U16, S16,     1, 0, Swap16, Swap16 ) 
    593785 
    594786#undef CONVERT_NN 
     
    616808 
    617809#undef CONVERT_INDIRECT 
    618  
    619  
    620  
  • modules/codec/lpcm.c

    ra90a19a r00906ea  
    22 * lpcm.c: lpcm decoder/packetizer module 
    33 ***************************************************************************** 
    4  * Copyright (C) 1999-2003 VideoLAN 
     4 * Copyright (C) 1999-2005 VideoLAN 
    55 * $Id$ 
    66 * 
     
    88 *          Henri Fallon <henri@videolan.org> 
    99 *          Christophe Massiot <massiot@via.ecp.fr> 
    10  *          Gildas Bazin <gbazin@netcourrier.com
     10 *          Gildas Bazin <gbazin@videolan.org
    1111 * 
    1212 * This program is free software; you can redistribute it and/or modify 
     
    119119    /* Set output properties */ 
    120120    p_dec->fmt_out.i_cat = AUDIO_ES; 
    121     p_dec->fmt_out.i_codec = VLC_FOURCC('s','1','6','b'); 
     121 
     122    if( p_dec->fmt_out.audio.i_bitspersample == 24 ) 
     123    { 
     124        p_dec->fmt_out.i_codec = VLC_FOURCC('s','2','4','b'); 
     125    } 
     126    else 
     127    { 
     128        p_dec->fmt_out.i_codec = VLC_FOURCC('s','1','6','b'); 
     129        p_dec->fmt_out.audio.i_bitspersample = 16; 
     130    } 
    122131 
    123132    /* Set callback */ 
     
    155164    block_t       *p_block; 
    156165    unsigned int  i_rate = 0, i_original_channels = 0, i_channels = 0; 
    157     int           i_frame_length
     166    int           i_frame_length, i_bitspersample
    158167    uint8_t       i_header; 
    159168 
     
    240249                               | AOUT_CHAN_CENTER | AOUT_CHAN_MIDDLELEFT 
    241250                               | AOUT_CHAN_MIDDLERIGHT | AOUT_CHAN_LFE; 
     251        break; 
     252    } 
     253 
     254    switch ( (i_header >> 6) & 0x3 ) 
     255    { 
     256    case 2: 
     257        p_dec->fmt_out.i_codec = VLC_FOURCC('s','2','4','b'); 
     258        p_dec->fmt_out.audio.i_bitspersample = 24; 
     259        i_bitspersample = 24; 
     260        break; 
     261    case 1: 
     262        p_dec->fmt_out.i_codec = VLC_FOURCC('s','2','4','b'); 
     263        p_dec->fmt_out.audio.i_bitspersample = 24; 
     264        i_bitspersample = 20; 
     265        break; 
     266    case 0: 
     267    default: 
     268        p_dec->fmt_out.i_codec = VLC_FOURCC('s','1','6','b'); 
     269        p_dec->fmt_out.audio.i_bitspersample = 16; 
     270        i_bitspersample = 16; 
    242271        break; 
    243272    } 
     
    264293 
    265294    i_frame_length = (p_block->i_buffer - LPCM_HEADER_LEN) / 
    266         ( p_dec->fmt_out.audio.i_channels * 2 )
     295        p_dec->fmt_out.audio.i_channels * 8 / i_bitspersample
    267296 
    268297    if( p_sys->b_packetizer ) 
    269298    { 
     299        p_dec->fmt_out.i_codec = VLC_FOURCC('l','p','c','m'); 
    270300        p_block->i_pts = p_block->i_dts = aout_DateGet( &p_sys->end_date ); 
    271301        p_block->i_length = 
     
    286316            aout_DateIncrement( &p_sys->end_date, i_frame_length ); 
    287317 
    288         memcpy( p_aout_buffer->p_buffer, 
    289                 p_block->p_buffer + LPCM_HEADER_LEN, 
    290                 p_block->i_buffer - LPCM_HEADER_LEN ); 
     318        p_block->p_buffer += LPCM_HEADER_LEN; 
     319        p_block->i_buffer -= LPCM_HEADER_LEN; 
     320 
     321        /* 20/24 bits LPCM use special packing */ 
     322        if( i_bitspersample == 24 ) 
     323        { 
     324            uint8_t *p_out = p_aout_buffer->p_buffer; 
     325 
     326            while( p_block->i_buffer / 12 ) 
     327            { 
     328                /* Sample 1 */ 
     329                p_out[0] = p_block->p_buffer[0]; 
     330                p_out[1] = p_block->p_buffer[1]; 
     331                p_out[2] = p_block->p_buffer[8]; 
     332                /* Sample 2 */ 
     333                p_out[3] = p_block->p_buffer[2]; 
     334                p_out[4] = p_block->p_buffer[3]; 
     335                p_out[5] = p_block->p_buffer[9]; 
     336                /* Sample 3 */ 
     337                p_out[6] = p_block->p_buffer[4]; 
     338                p_out[7] = p_block->p_buffer[5]; 
     339                p_out[8] = p_block->p_buffer[10]; 
     340                /* Sample 4 */ 
     341                p_out[9] = p_block->p_buffer[6]; 
     342                p_out[10] = p_block->p_buffer[7]; 
     343                p_out[11] = p_block->p_buffer[11]; 
     344 
     345                p_block->i_buffer -= 12; 
     346                p_block->p_buffer += 12; 
     347                p_out += 12; 
     348            } 
     349        } 
     350        else if( i_bitspersample == 20 ) 
     351        { 
     352            uint8_t *p_out = p_aout_buffer->p_buffer; 
     353 
     354            while( p_block->i_buffer / 10 ) 
     355            { 
     356                /* Sample 1 */ 
     357                p_out[0] = p_block->p_buffer[0]; 
     358                p_out[1] = p_block->p_buffer[1]; 
     359                p_out[2] = p_block->p_buffer[8] & 0xF0; 
     360                /* Sample 2 */ 
     361                p_out[3] = p_block->p_buffer[2]; 
     362                p_out[4] = p_block->p_buffer[3]; 
     363                p_out[5] = p_block->p_buffer[8] << 4; 
     364                /* Sample 3 */ 
     365                p_out[6] = p_block->p_buffer[4]; 
     366                p_out[7] = p_block->p_buffer[5]; 
     367                p_out[8] = p_block->p_buffer[9] & 0xF0; 
     368                /* Sample 4 */ 
     369                p_out[9] = p_block->p_buffer[6]; 
     370                p_out[10] = p_block->p_buffer[7]; 
     371                p_out[11] = p_block->p_buffer[9] << 4; 
     372 
     373                p_block->i_buffer -= 10; 
     374                p_block->p_buffer += 10; 
     375                p_out += 12; 
     376            } 
     377        } 
     378        else 
     379        { 
     380            memcpy( p_aout_buffer->p_buffer, 
     381                    p_block->p_buffer, p_block->i_buffer ); 
     382        } 
    291383 
    292384        block_Release( p_block );