annotate libmpcodecs/ad_libdv.c @ 24576:6704a924d4aa

According to MSDN a thread must call CoUninitialize once for each successful call it has made to CoInitialize or CoInitializeEx, including any call that returns S_FALSE. Only the CoUninitialize call corresponding to the CoInitialize or CoInitializeEx call that initialized the library can close it. patch by Gianluigi Tiesi, mplayer netfarm it
author diego
date Sun, 23 Sep 2007 20:37:33 +0000
parents 71b3e04d0555
children 0f1b5b68af32
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6927
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
1 #include <stdio.h>
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
2 #include <stdlib.h>
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
3 #include <string.h>
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
4 #include <sys/types.h>
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
5 #include <unistd.h>
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
6 #include <math.h>
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
7
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
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
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
11
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
12 #include "img_format.h"
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
13
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
14 #include <libdv/dv.h>
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
15 #include <libdv/dv_types.h>
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
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
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
20
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
21 #include "ad_internal.h"
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
22
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
23 static ad_info_t info =
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
24 {
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
25 "Raw DV Audio Decoder",
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
26 "libdv",
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
27 "Alexander Neundorf <neundorf@kde.org>",
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
28 "http://libdv.sf.net",
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
29 ""
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
30 };
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
31
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
32 LIBAD_EXTERN(libdv)
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
33
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
34 // defined in vd_libdv.c:
22886
71b3e04d0555 "()" to "(void)" function param list fixes
uau
parents: 22601
diff changeset
35 dv_decoder_t* init_global_rawdv_decoder(void);
6927
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
36
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
37 static int preinit(sh_audio_t *sh_audio)
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
38 {
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
39 sh_audio->audio_out_minsize=4*DV_AUDIO_MAX_SAMPLES*2;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
40 return 1;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
41 }
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
42
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
43 static int16_t *audioBuffers[4]={NULL,NULL,NULL,NULL};
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
44
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
45 static int init(sh_audio_t *sh)
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
46 {
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
47 int i;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
48 WAVEFORMATEX *h=sh->wf;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
49
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
50 if(!h) return 0;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
51
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
52 sh->i_bps=h->nAvgBytesPerSec;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
53 sh->channels=h->nChannels;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
54 sh->samplerate=h->nSamplesPerSec;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
55 sh->samplesize=(h->wBitsPerSample+7)/8;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
56
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
57 sh->context=init_global_rawdv_decoder();
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
58
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
59 for (i=0; i < 4; i++)
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
60 audioBuffers[i] = malloc(2*DV_AUDIO_MAX_SAMPLES);
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
61
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
62 return 1;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
63 }
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
64
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
65 static void uninit(sh_audio_t *sh_audio)
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
66 {
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
67 int i;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
68 for (i=0; i < 4; i++)
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
69 free(audioBuffers[i]);
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
70 }
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
71
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
72 static int control(sh_audio_t *sh,int cmd,void* arg, ...)
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
73 {
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
74 // TODO!!!
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
75 return CONTROL_UNKNOWN;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
76 }
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
77
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
78 static int decode_audio(sh_audio_t *audio, unsigned char *buf, int minlen, int maxlen)
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
79 {
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
80 int len=0;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
81 dv_decoder_t* decoder=audio->context; //global_rawdv_decoder;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
82 unsigned char* dv_audio_frame=NULL;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
83 int xx=ds_get_packet(audio->ds,&dv_audio_frame);
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
84 if(xx<=0 || !dv_audio_frame) return 0; // EOF?
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
85
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
86 dv_parse_header(decoder, dv_audio_frame);
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
87
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
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
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
90 xx, decoder->frame_size);
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
91
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
92 if (dv_decode_full_audio(decoder, dv_audio_frame,(int16_t**) audioBuffers))
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
93 {
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
94 /* Interleave the audio into a single buffer */
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
95 int i=0;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
96 int16_t *bufP=(int16_t*)buf;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
97
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
98 // printf("samples=%d/%d chans=%d mem=%d \n",decoder->audio->samples_this_frame,DV_AUDIO_MAX_SAMPLES,
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
99 // decoder->audio->num_channels, decoder->audio->samples_this_frame*decoder->audio->num_channels*2);
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
100
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
101 // return (44100/30)*4;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
102
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
103 for (i=0; i < decoder->audio->samples_this_frame; i++)
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
104 {
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
105 int ch;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
106 for (ch=0; ch < decoder->audio->num_channels; ch++)
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
107 bufP[len++] = audioBuffers[ch][i];
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
108 }
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
109 }
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
110 return len*2;
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
111 }