annotate libmpcodecs/ad_libdv.c @ 9076:92014b66ed3d

ability to disable the nonsense expand filter is a must! otherwise it's impossible to render subtitles earlier in the filter chain and then scale them down with a scale filter; huge subs will get rendered again on top!! (think dvd/vobsub where you can't just use smaller font size) if anyone has a better way to handle this, do it! (e.g. make it so that the first expand filter disabled osd for the rest of the filter chain)
author rfelker
date Fri, 24 Jan 2003 01:04:50 +0000
parents 28677d779205
children bcd805923554
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"
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
9
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
10 #ifdef HAVE_LIBDV095
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
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
17 #include "stream.h"
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
18 #include "demuxer.h"
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
19 #include "stheader.h"
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:
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
35 dv_decoder_t* init_global_rawdv_decoder();
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)
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
89 printf("warning! audio framesize differs! read=%d hdr=%d \n",
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 }
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
112
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
113 #endif
0145bba6e201 native DV audio/video decoders using libdv
arpi
parents:
diff changeset
114