annotate DOCS/tech/hwac3.txt @ 31290:f60cd3b9d453

libmpeg2: Move pending_buffer stuff to local decoder context. It is only used in our wrapper code, so there is no point to patch it into our libmpeg2 copy. This also helps when trying to use external libmpeg2. patch by Luca Barbato
author diego
date Wed, 09 Jun 2010 16:56:21 +0000
parents 0ad2da052b2e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4778
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
1 mails by A'rpi and Marcus Blomenkamp <Marcus.Blomenkamp@epost.de>
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
2 describing how this ac3-passtrough hack work under linux and mplayer...
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
3 -----------------------------------------------------------------------
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
4 Hi,
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
5
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
6 > I received the following patch from Steven Brookes <stevenjb@mda.co.uk>.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
7 > He is working on fixing the digital audio output of the dxr3 driver and
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
8 > told me he fixed some bugs in mplayer along the way. I don't know shit
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
9 > about hwac3 output so all I did was to make sure the patch applied
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
10 > against latest cvs.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
11 > This is from his e-mail to me:
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
12 >
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
13 > "Secondly there is a patch to dec_audio.c and
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
14 > ac3-iec958 to fix the -ac hwac3 codec stuff and to use liba52 to sync it.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
15
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
16 > Seems to work for everything I've thrown at and maintains sync for all audio
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
17 > types through the DXR3."
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
18
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
19 patch applied (with some comments added and an unwanted change (in software
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
20 a52 decoder) removed)
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
21
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
22 now i understand how this whole hwac3 mess work.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
23 it's very very tricky. it virtually decodes ac3 to LPCM packets, but really
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
24 it keeps the original compressed data padded by zeros. this way it's
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
25 constant bitrate, and sync is calculated just like for stereo PCM.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
26 (so it bypass LPCM-capable media converters...)
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
27
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
28 so, every ac3 frame is translated to 6144 byte long tricky LPCM packet.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
29 6144 = 4*(6*256) = 4 * samples_per_ac3_frame = LPCM size of uncompressed ac3
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
30 frame.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
31
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
32 i wanna know if it works for sblive and other ac3-capable cards too?
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
33 (i can't test it, lack of ac3 decoder)
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
34
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
35 A'rpi / Astral & ESP-team
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
36
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
37 -----------------------------------------------------------------------
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
38 Hi folks.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
39 I spend some time fiddling with ac3 passthrough in mplayer. The
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
40 traditional way of setting the output format to AFMT_AC3 was no ideal
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
41 solution since not all digital io cards/drivers supported this format or
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
42 honoured it to set the spdif non-audio bit. To make it short, it only
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
43 worked with oss sblive driver IIRC.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
44
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
45 Inspired by alsa's ac3dec program I found an alternative way by
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
46 inspecting to which format the alsa device had been set. Suprise: it was
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
47 simple 16bit_le 2_channel pcm. So setting the non-audio bit doesn't
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
48 necessarily mean the point. The only important thing seems to be
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
49 bit-identical output at the correct samplerate. Modern AV-Receivers seem
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
50 to be quite tolerant/compatible.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
51
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
52 So I changed the output format of hwac3 from
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
53
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
54 AFMT_AC3 channels=1
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
55 to
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
56 AFMT_S16_LE channels=2
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
57
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
58 and corrected the absolute time calculation. That was all to get it
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
59 running for me.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
60
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
61 -----------------------------------------------------------------------
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
62 Hi there.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
63
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
64 Perhaps I can clear up some mystification about AC3 passthrough in
4778
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
65 general and mplayer in special:
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
66
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
67 To get the external decoder solution working, it must be fed with data
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
68 which is bitidentical to the chunks in the source ac3 file (compressed
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
69 data is very picky about bit errors). Additionally - or better to say
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
70 'historically' - the non-audio bit should be set in the spdif status
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
71 fields to prevent old spdif hardware from reproducing ugly scratchy
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
72 noise. Note: for current decoders (probably those with DTS capability)
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
73 this safety bit isn't needed anymore. At least I can state that for my
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
74 Sherwood RVD-6095RDS. I think it is due to DTS because DTS sound can
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
75 reside on a ordinary AudioCD and an ordinary AudioCD-Player will always
4778
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
76 have it's audio-bit set.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
77
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
78 The sample format of the data must be 2channel 16bit (little endian
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
79 IIRC). Samplerates are 48kHz - although my receiver also accepts
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
80 44100Hz. I do not know if this is due to an over-compatability of my
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
81 receiver or if 44100 is also possible in the ac3 specs. For safety's
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
82 sake lets keep this at 48000Hz. AC3 data chunks are inserted into the
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
83 stream every 0x1600 bytes (don't bite me on that, look into
4778
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
84 'ac3-iec958.c': 'ac3_iec958_build_burst').
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
85
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
86 To come back to the problem: data must be played bit-identically through
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
87 the soundcard at the correct samplerate and should optionally have it's
4778
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
88 non-audio bit set. There are two ways to accomplish this:
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
89
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
90 1) Some OSS guy invented the format AFMT_AC3. Soundcard drivers
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
91 implementing this format should therefore adjust it's mixers and
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
92 switches to produce the desired output. Unfortunately some soundcard
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
93 drivers do not support this format correctly and most do not even
4778
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
94 support it at all (including ALSA).
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
95
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
96 2) The alternative approach currently in mplayer CVS is to simply set
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
97 the output format to 48kHz16bitLE and rely on the user to have the
4778
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
98 soundcard mixers adjusted properly.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
99
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
100 I do have two soundcards with digital IO facilities (CMI8738 and
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
101 Trident4DWaveNX based) plus the mentioned decoder. I'm currently running
4778
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
102 Linux-2.4.17. Following configurations are happily running here:
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
103
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
104 1. Trident with ALSA drivers (OSS does not support Hoontech's dig. IO)
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
105 2. CMI with ALSA drivers
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
106 3. CMI with OSS drivers
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
107
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
108 For Linux I'd suggest using ALSA because of it's cleaner architecture
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
109 and more consitent user interface. Not to mention that it'll be the
4778
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
110 standard sound support in Linux soon.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
111
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
112 For those who want to stick to OSS drivers: The CMI8738 drivers works
4778
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
113 out-of-the-box, if the PCM/Wave mixer is set to 100%.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
114
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
115 For ALSA I'd suggest using its OSS emulation. More on that later.
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
116 ALSA-0.9 invented the idea of cards, devices and dubdevices. You can
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
117 reach the digital interface of all supported cards consitently by using
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
118 the device 'hw:x,2' (x counting from 0 is the number of your soundcard).
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
119 So most people would end up at 'hw:0,2'. This device can only be opened
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
120 in sample formats and rates which are directly supported in hardware
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
121 hence no samplerate conversion is done keeping the stream as-is. However
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
122 most consumer soundcards do not support 44kHz so it would definitively
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
123 be a bad idea to use this as your standard device if you wanted to
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
124 listen to some mp3s (most of them are 44kHz due to CD source). Here the
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
125 OSS comes to play again. You can configure which OSS device (/dev/dsp
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
126 and /dev/adsp) uses which ALSA device. So I'd suggest pointing the
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
127 standard '/dev/dsp' to standard 'hw:0,0' which suports mixing and
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
128 samplerate conversion. No further reconfiguration would be needed for
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
129 your sound apps. For movies I'd point '/dev/adsp' to 'hw:0,2' and
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
130 configure mplayer to use adsp instead of dsp. The samplerate constrain
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
131 is no big deal here since movies usually are in 48Khz anyway. The
4778
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
132 configuration in '/etc/modules.conf' is no big deal also:
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
133
30990
0ad2da052b2e the great MPlayer tab removal: part I
diego
parents: 29263
diff changeset
134 alias snd-card-0 snd-card-cmipci # insert your card here
0ad2da052b2e the great MPlayer tab removal: part I
diego
parents: 29263
diff changeset
135 alias snd-card-1 snd-pcm-oss # load OSS emulation
0ad2da052b2e the great MPlayer tab removal: part I
diego
parents: 29263
diff changeset
136 options snd-pcm-oss snd_dsp_map=0 snd_adsp_map=2 # do the mapping
4778
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
137
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
138 This works flawlessly in combination with alsa's native
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
139 SysVrc-init-script 'alsasound'. Be sure to disable any distribution
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 22316
diff changeset
140 dependent script (e.g. Mandrake-8.1 has an 'alsa' script which depends
4778
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
141 on ALSA-0.5).
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
142
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
143 Sorry for you *BSD'lers out there. I have no grasp on sound support there.
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
144
85d041ad0c87 3 mails describing hwac3 tech details
arpi
parents:
diff changeset
145 HTH Marcus