summaryrefslogtreecommitdiff
path: root/src/liba52/xine_decoder.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/liba52/xine_decoder.c')
-rw-r--r--src/liba52/xine_decoder.c82
1 files changed, 76 insertions, 6 deletions
diff --git a/src/liba52/xine_decoder.c b/src/liba52/xine_decoder.c
index 1c8da9e74..4fc3de135 100644
--- a/src/liba52/xine_decoder.c
+++ b/src/liba52/xine_decoder.c
@@ -17,11 +17,14 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: xine_decoder.c,v 1.12 2001/11/20 01:43:30 guenter Exp $
+ * $Id: xine_decoder.c,v 1.13 2001/12/09 18:31:01 jcdutton Exp $
*
* stuff needed to turn liba52 into a xine decoder plugin
*/
+/* required for swab() */
+#define _XOPEN_SOURCE 500
+
#include <stdlib.h>
#include <unistd.h>
@@ -77,6 +80,54 @@ typedef struct a52dec_decoder_s {
int enable_surround_downmix;
} a52dec_decoder_t;
+struct frmsize_s
+{
+ uint16_t bit_rate;
+ uint16_t frm_size[3];
+};
+
+static const struct frmsize_s frmsizecod_tbl[64] =
+{
+ { 32 ,{64 ,69 ,96 } },
+ { 32 ,{64 ,70 ,96 } },
+ { 40 ,{80 ,87 ,120 } },
+ { 40 ,{80 ,88 ,120 } },
+ { 48 ,{96 ,104 ,144 } },
+ { 48 ,{96 ,105 ,144 } },
+ { 56 ,{112 ,121 ,168 } },
+ { 56 ,{112 ,122 ,168 } },
+ { 64 ,{128 ,139 ,192 } },
+ { 64 ,{128 ,140 ,192 } },
+ { 80 ,{160 ,174 ,240 } },
+ { 80 ,{160 ,175 ,240 } },
+ { 96 ,{192 ,208 ,288 } },
+ { 96 ,{192 ,209 ,288 } },
+ { 112 ,{224 ,243 ,336 } },
+ { 112 ,{224 ,244 ,336 } },
+ { 128 ,{256 ,278 ,384 } },
+ { 128 ,{256 ,279 ,384 } },
+ { 160 ,{320 ,348 ,480 } },
+ { 160 ,{320 ,349 ,480 } },
+ { 192 ,{384 ,417 ,576 } },
+ { 192 ,{384 ,418 ,576 } },
+ { 224 ,{448 ,487 ,672 } },
+ { 224 ,{448 ,488 ,672 } },
+ { 256 ,{512 ,557 ,768 } },
+ { 256 ,{512 ,558 ,768 } },
+ { 320 ,{640 ,696 ,960 } },
+ { 320 ,{640 ,697 ,960 } },
+ { 384 ,{768 ,835 ,1152 } },
+ { 384 ,{768 ,836 ,1152 } },
+ { 448 ,{896 ,975 ,1344 } },
+ { 448 ,{896 ,976 ,1344 } },
+ { 512 ,{1024 ,1114 ,1536 } },
+ { 512 ,{1024 ,1115 ,1536 } },
+ { 576 ,{1152 ,1253 ,1728 } },
+ { 576 ,{1152 ,1254 ,1728 } },
+ { 640 ,{1280 ,1393 ,1920 } },
+ { 640 ,{1280 ,1394 ,1920 } }
+};
+
int a52dec_can_handle (audio_decoder_t *this_gen, int buf_type) {
return ((buf_type & 0xFFFF0000) == BUF_AUDIO_A52) ;
}
@@ -342,12 +393,31 @@ static void a52dec_decode_frame (a52dec_decoder_t *this, uint32_t pts, uint32_t
}
if (this->output_open) {
-
+ /* SPDIF Passthrough
+ * Build SPDIF Header and encaps the A52 audio data in it.
+ */
+ uint32_t syncword, crc1, fscod,frmsizecod,bsid,bsmod,frame_size;
+ uint8_t *data_out,*data_in;
audio_buffer_t *buf = this->audio_out->get_buffer (this->audio_out);
-
- memcpy (buf->mem, this->frame_buffer, this->frame_length);
-
- buf->num_frames = this->frame_length;
+ data_in=(uint8_t *) this->frame_buffer;
+ data_out=(uint8_t *) buf->mem;
+ syncword = data_in[0] | (data_in[1] << 8);
+ crc1 = data_in[2] | (data_in[3] << 8);
+ fscod = (data_in[4] >> 6) & 0x3;
+ frmsizecod = data_in[4] & 0x3f;
+ bsid = (data_in[5] >> 3) & 0x1f;
+ bsmod = data_in[5] & 0x7; // bsmod, stream = 0
+ frame_size = frmsizecod_tbl[frmsizecod].frm_size[fscod] ;
+
+ data_out[0] = 0x72; data_out[1] = 0xf8; /* spdif syncword */
+ data_out[2] = 0x1f; data_out[3] = 0x4e; /* .............. */
+ data_out[4] = 0x01; /* AC3 data */
+ data_out[5] = bsmod; /* bsmod, stream = 0 */
+ data_out[6] = (frame_size << 4) & 0xff; /* frame_size * 16 */
+ data_out[7] = ((frame_size ) >> 4) & 0xff;
+ swab(data_in, &data_out[8], frame_size * 2 );
+
+ buf->num_frames = 1536;
buf->vpts = pts;
buf->scr = scr;