2 * This file is part of MPlayer.
4 * MPlayer is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * MPlayer is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 #include <sys/types.h>
30 #include "img_format.h"
33 #include <libdv/dv_types.h>
35 #include "stream/stream.h"
36 #include "libmpdemux/demuxer.h"
37 #include "libmpdemux/stheader.h"
39 #include "ad_internal.h"
42 static const ad_info_t info
=
44 "Raw DV Audio Decoder",
46 "Alexander Neundorf <neundorf@kde.org>",
47 "http://libdv.sf.net",
53 static int preinit(sh_audio_t
*sh_audio
)
55 sh_audio
->audio_out_minsize
=4*DV_AUDIO_MAX_SAMPLES
*2;
59 static int16_t *audioBuffers
[4]={NULL
,NULL
,NULL
,NULL
};
61 static int init(sh_audio_t
*sh
)
64 WAVEFORMATEX
*h
=sh
->wf
;
68 sh
->i_bps
=h
->nAvgBytesPerSec
;
69 sh
->channels
=h
->nChannels
;
70 sh
->samplerate
=h
->nSamplesPerSec
;
71 sh
->samplesize
=(h
->wBitsPerSample
+7)/8;
73 sh
->context
=init_global_rawdv_decoder();
76 audioBuffers
[i
] = malloc(2*DV_AUDIO_MAX_SAMPLES
);
81 static void uninit(sh_audio_t
*sh_audio
)
85 free(audioBuffers
[i
]);
88 static int control(sh_audio_t
*sh
,int cmd
,void* arg
, ...)
91 return CONTROL_UNKNOWN
;
94 static int decode_audio(sh_audio_t
*audio
, unsigned char *buf
, int minlen
, int maxlen
)
97 dv_decoder_t
* decoder
=audio
->context
; //global_rawdv_decoder;
98 unsigned char* dv_audio_frame
=NULL
;
99 int xx
=ds_get_packet(audio
->ds
,&dv_audio_frame
);
100 if(xx
<=0 || !dv_audio_frame
) return 0; // EOF?
102 dv_parse_header(decoder
, dv_audio_frame
);
104 if(xx
!=decoder
->frame_size
)
105 mp_tmsg(MSGT_GLOBAL
,MSGL_WARN
,"[AD_LIBDV] Warning! Audio framesize differs! read=%d hdr=%d.\n",
106 xx
, decoder
->frame_size
);
108 if (dv_decode_full_audio(decoder
, dv_audio_frame
,(int16_t**) audioBuffers
))
110 /* Interleave the audio into a single buffer */
112 int16_t *bufP
=(int16_t*)buf
;
114 // printf("samples=%d/%d chans=%d mem=%d \n",decoder->audio->samples_this_frame,DV_AUDIO_MAX_SAMPLES,
115 // decoder->audio->num_channels, decoder->audio->samples_this_frame*decoder->audio->num_channels*2);
117 // return (44100/30)*4;
119 for (i
=0; i
< decoder
->audio
->samples_this_frame
; i
++)
122 for (ch
=0; ch
< decoder
->audio
->num_channels
; ch
++)
123 bufP
[len
++] = audioBuffers
[ch
][i
];