Mercurial > mplayer.hg
annotate libmpcodecs/ad_libdv.c @ 24900:9079c9745ff9
A/V sync: take audio filter buffers into account
Substract the delay caused by filter buffering when calculating
currently playing audio position. This matters for af_scaletempo which
buffers significant and varying amounts of data. For other current
filters the effect is normally insignificant.
Instead of the old time-based filter delay field (which was ignored)
this version stores the per-filter delay in units of bytes input read
without corresponding output. This allows the current scaletempo
behavior where other filters before and after it can see the same
nominal samplerate even though the real duration of the data varies;
in this case the other filters can not know the delay they're causing
in terms of real time.
author | uau |
---|---|
date | Thu, 01 Nov 2007 06:52:50 +0000 |
parents | 71b3e04d0555 |
children | 0f1b5b68af32 |
rev | line source |
---|---|
6927 | 1 #include <stdio.h> |
2 #include <stdlib.h> | |
3 #include <string.h> | |
4 #include <sys/types.h> | |
5 #include <unistd.h> | |
6 #include <math.h> | |
7 | |
8 #include "config.h" | |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
7180
diff
changeset
|
9 #include "mp_msg.h" |
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
7180
diff
changeset
|
10 #include "help_mp.h" |
6927 | 11 |
12 #include "img_format.h" | |
13 | |
14 #include <libdv/dv.h> | |
15 #include <libdv/dv_types.h> | |
16 | |
22599
4faee1254928
Add explicit location for headers from the stream/ directory.
diego
parents:
18771
diff
changeset
|
17 #include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22599
diff
changeset
|
18 #include "libmpdemux/demuxer.h" |
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22599
diff
changeset
|
19 #include "libmpdemux/stheader.h" |
6927 | 20 |
21 #include "ad_internal.h" | |
22 | |
23 static ad_info_t info = | |
24 { | |
25 "Raw DV Audio Decoder", | |
26 "libdv", | |
27 "Alexander Neundorf <neundorf@kde.org>", | |
28 "http://libdv.sf.net", | |
29 "" | |
30 }; | |
31 | |
32 LIBAD_EXTERN(libdv) | |
33 | |
34 // defined in vd_libdv.c: | |
22886 | 35 dv_decoder_t* init_global_rawdv_decoder(void); |
6927 | 36 |
37 static int preinit(sh_audio_t *sh_audio) | |
38 { | |
39 sh_audio->audio_out_minsize=4*DV_AUDIO_MAX_SAMPLES*2; | |
40 return 1; | |
41 } | |
42 | |
43 static int16_t *audioBuffers[4]={NULL,NULL,NULL,NULL}; | |
44 | |
45 static int init(sh_audio_t *sh) | |
46 { | |
47 int i; | |
48 WAVEFORMATEX *h=sh->wf; | |
49 | |
50 if(!h) return 0; | |
51 | |
52 sh->i_bps=h->nAvgBytesPerSec; | |
53 sh->channels=h->nChannels; | |
54 sh->samplerate=h->nSamplesPerSec; | |
55 sh->samplesize=(h->wBitsPerSample+7)/8; | |
56 | |
57 sh->context=init_global_rawdv_decoder(); | |
58 | |
59 for (i=0; i < 4; i++) | |
60 audioBuffers[i] = malloc(2*DV_AUDIO_MAX_SAMPLES); | |
61 | |
62 return 1; | |
63 } | |
64 | |
65 static void uninit(sh_audio_t *sh_audio) | |
66 { | |
67 int i; | |
68 for (i=0; i < 4; i++) | |
69 free(audioBuffers[i]); | |
70 } | |
71 | |
72 static int control(sh_audio_t *sh,int cmd,void* arg, ...) | |
73 { | |
74 // TODO!!! | |
75 return CONTROL_UNKNOWN; | |
76 } | |
77 | |
78 static int decode_audio(sh_audio_t *audio, unsigned char *buf, int minlen, int maxlen) | |
79 { | |
80 int len=0; | |
81 dv_decoder_t* decoder=audio->context; //global_rawdv_decoder; | |
82 unsigned char* dv_audio_frame=NULL; | |
83 int xx=ds_get_packet(audio->ds,&dv_audio_frame); | |
84 if(xx<=0 || !dv_audio_frame) return 0; // EOF? | |
85 | |
86 dv_parse_header(decoder, dv_audio_frame); | |
87 | |
88 if(xx!=decoder->frame_size) | |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
7180
diff
changeset
|
89 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_MPCODECS_AudioFramesizeDiffers, |
6927 | 90 xx, decoder->frame_size); |
91 | |
92 if (dv_decode_full_audio(decoder, dv_audio_frame,(int16_t**) audioBuffers)) | |
93 { | |
94 /* Interleave the audio into a single buffer */ | |
95 int i=0; | |
96 int16_t *bufP=(int16_t*)buf; | |
97 | |
98 // printf("samples=%d/%d chans=%d mem=%d \n",decoder->audio->samples_this_frame,DV_AUDIO_MAX_SAMPLES, | |
99 // decoder->audio->num_channels, decoder->audio->samples_this_frame*decoder->audio->num_channels*2); | |
100 | |
101 // return (44100/30)*4; | |
102 | |
103 for (i=0; i < decoder->audio->samples_this_frame; i++) | |
104 { | |
105 int ch; | |
106 for (ch=0; ch < decoder->audio->num_channels; ch++) | |
107 bufP[len++] = audioBuffers[ch][i]; | |
108 } | |
109 } | |
110 return len*2; | |
111 } |