vlc | branch: master | Francois Cartegnie <[email protected]> | Thu Apr 10 19:54:21 2014 +0200| [69adf3b6954f157b9566a52b66b0f2e63a496dcd] | committer: Francois Cartegnie
codecs: lpcm: add WiDi LPCM > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=69adf3b6954f157b9566a52b66b0f2e63a496dcd --- include/vlc_fourcc.h | 1 + modules/codec/lpcm.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/include/vlc_fourcc.h b/include/vlc_fourcc.h index 8aaabd8..5ce8538 100644 --- a/include/vlc_fourcc.h +++ b/include/vlc_fourcc.h @@ -366,6 +366,7 @@ #define VLC_CODEC_DVD_LPCM VLC_FOURCC('l','p','c','m') #define VLC_CODEC_DVDA_LPCM VLC_FOURCC('a','p','c','m') #define VLC_CODEC_BD_LPCM VLC_FOURCC('b','p','c','m') +#define VLC_CODEC_WIDI_LPCM VLC_FOURCC('w','p','c','m') #define VLC_CODEC_SDDS VLC_FOURCC('s','d','d','s') #define VLC_CODEC_MIDI VLC_FOURCC('M','I','D','I') #define VLC_CODEC_RALF VLC_FOURCC('R','A','L','F') diff --git a/modules/codec/lpcm.c b/modules/codec/lpcm.c index 24c8555..e3dad87 100644 --- a/modules/codec/lpcm.c +++ b/modules/codec/lpcm.c @@ -142,17 +142,30 @@ struct encoder_sys_t * - frequency (4 bits) * - bits per sample (2 bits) * - unknown (6 bits) + * + * LPCM WIDI header + * refers http://www.dvdforum.org/images/Guideline1394V10R0_20020911.pdf + * - sub stream id (8 bits) = 0xa0 + * - frame header count (8 bits) = 0x06 + * [ 0b0000000 (7 bits) + * - audio emphasis (1 bit) ] (8 bits) + * [ qz word length (2 bits) 0x00 == 16bits + * - sampling freq (3 bits) 0b001 == 44.1K, 0b010 == 48K Hz + * - channels count(3 bits) ] (8 bits) 0b000 == dual mono, 0b001 == stereo + * follows: LPCM data (15360 bits/1920 bytes) */ #define LPCM_VOB_HEADER_LEN (6) #define LPCM_AOB_HEADER_LEN (11) #define LPCM_BD_HEADER_LEN (4) +#define LPCM_WIDI_HEADER_LEN (4) enum { LPCM_VOB, LPCM_AOB, LPCM_BD, + LPCM_WIDI, }; typedef struct @@ -190,7 +203,11 @@ static int BdHeader( decoder_sys_t *p_sys, unsigned *pi_bits, const uint8_t *p_header ); static void BdExtract( block_t *, block_t *, unsigned, unsigned, unsigned, unsigned ); - +/* */ +static int WidiHeader( unsigned *pi_rate, + unsigned *pi_channels, unsigned *pi_original_channels, + unsigned *pi_bits, + const uint8_t *p_header ); /***************************************************************************** * OpenCommon: @@ -219,6 +236,11 @@ static int OpenCommon( vlc_object_t *p_this, bool b_packetizer ) i_type = LPCM_BD; i_header_size = LPCM_BD_HEADER_LEN; break; + /* WIDI LPCM */ + case VLC_CODEC_WIDI_LPCM: + i_type = LPCM_WIDI; + i_header_size = LPCM_WIDI_HEADER_LEN; + break; default: return VLC_EGENERIC; } @@ -247,6 +269,9 @@ static int OpenCommon( vlc_object_t *p_this, bool b_packetizer ) case LPCM_AOB: p_dec->fmt_out.i_codec = VLC_CODEC_DVDA_LPCM; break; + case LPCM_WIDI: + p_dec->fmt_out.i_codec = VLC_CODEC_WIDI_LPCM; + break; default: assert(0); case LPCM_BD: @@ -342,6 +367,10 @@ static block_t *DecodeFrame( decoder_t *p_dec, block_t **pp_block ) i_ret = BdHeader( p_sys, &i_rate, &i_channels, &i_channels_padding, &i_original_channels, &i_bits, p_block->p_buffer ); break; + case LPCM_WIDI: + i_ret = WidiHeader( &i_rate, &i_channels, &i_original_channels, &i_bits, + p_block->p_buffer ); + break; default: abort(); } @@ -414,6 +443,7 @@ static block_t *DecodeFrame( decoder_t *p_dec, block_t **pp_block ) switch( p_sys->i_type ) { + case LPCM_WIDI: case LPCM_VOB: VobExtract( p_aout_buffer, p_block, i_bits ); break; @@ -972,6 +1002,38 @@ static int BdHeader( decoder_sys_t *p_sys, return 0; } +static int WidiHeader( unsigned *pi_rate, + unsigned *pi_channels, unsigned *pi_original_channels, + unsigned *pi_bits, + const uint8_t *p_header ) +{ + if ( p_header[0] != 0xa0 || p_header[1] != 0x06 ) + return -1; + + switch( ( p_header[3] & 0x38 ) >> 3 ) + { + case 0b001: + *pi_rate = 44100; + break; + case 0b010: + *pi_rate = 48000; + break; + default: + return -1; + } + + if( p_header[3] >> 6 != 0 ) + return -1; + else + *pi_bits = 16; + + *pi_channels = (p_header[3] & 0x7) + 1; + + *pi_original_channels = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT; + + return 0; +} + static void VobExtract( block_t *p_aout_buffer, block_t *p_block, unsigned i_bits ) { _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
