annotate libmpcodecs/ad_sample.c @ 26360:a48df598c055

Split cfg-common.h into two separate header files. It was being included twice with different definitions set that activated either the lower or the upper half of the header. The effectively simulated using two different header files. It is more straightforward to split the header instead.
author diego
date Fri, 11 Apr 2008 09:48:36 +0000
parents 815f03b7cee5
children 0f1b5b68af32
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5462
arpi
parents:
diff changeset
1 // SAMPLE audio decoder - you can use this file as template when creating new codec!
arpi
parents:
diff changeset
2
arpi
parents:
diff changeset
3 #include <stdio.h>
arpi
parents:
diff changeset
4 #include <stdlib.h>
arpi
parents:
diff changeset
5 #include <unistd.h>
arpi
parents:
diff changeset
6
arpi
parents:
diff changeset
7 #include "config.h"
arpi
parents:
diff changeset
8 #include "ad_internal.h"
arpi
parents:
diff changeset
9
arpi
parents:
diff changeset
10 static ad_info_t info = {
arpi
parents:
diff changeset
11 "Sample audio decoder", // name of the driver
arpi
parents:
diff changeset
12 "sample", // driver name. should be the same as filename without ad_
arpi
parents:
diff changeset
13 "A'rpi", // writer/maintainer of _this_ file
arpi
parents:
diff changeset
14 "", // writer/maintainer/site of the _codec_
arpi
parents:
diff changeset
15 "" // comments
arpi
parents:
diff changeset
16 };
arpi
parents:
diff changeset
17
arpi
parents:
diff changeset
18 LIBAD_EXTERN(sample)
arpi
parents:
diff changeset
19
arpi
parents:
diff changeset
20 #include "libsample/sample.h" // include your codec's .h files here
arpi
parents:
diff changeset
21
arpi
parents:
diff changeset
22 static int preinit(sh_audio_t *sh){
arpi
parents:
diff changeset
23 // let's check if the driver is available, return 0 if not.
arpi
parents:
diff changeset
24 // (you should do that if you use external lib(s) which is optional)
arpi
parents:
diff changeset
25 ...
arpi
parents:
diff changeset
26
arpi
parents:
diff changeset
27 // there are default values set for buffering, but you can override them:
arpi
parents:
diff changeset
28
arpi
parents:
diff changeset
29 // minimum output buffer size (should be the uncompressed max. frame size)
arpi
parents:
diff changeset
30 sh->audio_out_minsize=4*2*1024; // in this sample, we assume max 4 channels,
arpi
parents:
diff changeset
31 // 2 bytes/sample and 1024 samples/frame
arpi
parents:
diff changeset
32 // Default: 8192
arpi
parents:
diff changeset
33
arpi
parents:
diff changeset
34 // minimum input buffer size (set only if you need input buffering)
arpi
parents:
diff changeset
35 // (should be the max compressed frame size)
arpi
parents:
diff changeset
36 sh->audio_in_minsize=2048; // Default: 0 (no input buffer)
arpi
parents:
diff changeset
37
arpi
parents:
diff changeset
38 // if you set audio_in_minsize non-zero, the buffer will be allocated
arpi
parents:
diff changeset
39 // before the init() call by the core, and you can access it via
arpi
parents:
diff changeset
40 // pointer: sh->audio_in_buffer
arpi
parents:
diff changeset
41 // it will free'd after uninit(), so you don't have to use malloc/free here!
arpi
parents:
diff changeset
42
arpi
parents:
diff changeset
43 // the next few parameters define the audio format (channels, sample type,
arpi
parents:
diff changeset
44 // in/out bitrate etc.). it's OK to move these to init() if you can set
arpi
parents:
diff changeset
45 // them only after some initialization:
arpi
parents:
diff changeset
46
arpi
parents:
diff changeset
47 sh->samplesize=2; // bytes (not bits!) per sample per channel
arpi
parents:
diff changeset
48 sh->channels=2; // number of channels
arpi
parents:
diff changeset
49 sh->samplerate=44100; // samplerate
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 7180
diff changeset
50 sh->sample_format=AF_FORMAT_S16_LE; // sample format, see libao2/afmt.h
5462
arpi
parents:
diff changeset
51
arpi
parents:
diff changeset
52 sh->i_bps=64000/8; // input data rate (compressed bytes per second)
arpi
parents:
diff changeset
53 // Note: if you have VBR or unknown input rate, set it to some common or
arpi
parents:
diff changeset
54 // average value, instead of zero. it's used to predict time delay of
arpi
parents:
diff changeset
55 // buffered compressed bytes, so it must be more-or-less real!
arpi
parents:
diff changeset
56
arpi
parents:
diff changeset
57 //sh->o_bps=... // output data rate (uncompressed bytes per second)
arpi
parents:
diff changeset
58 // Note: you DON'T need to set o_bps in most cases, as it defaults to:
arpi
parents:
diff changeset
59 // sh->samplesize*sh->channels*sh->samplerate;
arpi
parents:
diff changeset
60
arpi
parents:
diff changeset
61 // for constant rate compressed QuickTime (.mov files) codecs you MUST
arpi
parents:
diff changeset
62 // set the compressed and uncompressed packet size (used by the demuxer):
arpi
parents:
diff changeset
63 sh->ds->ss_mul = 34; // compressed packet size
arpi
parents:
diff changeset
64 sh->ds->ss_div = 64; // samples per packet
arpi
parents:
diff changeset
65
arpi
parents:
diff changeset
66 return 1; // return values: 1=OK 0=ERROR
arpi
parents:
diff changeset
67 }
arpi
parents:
diff changeset
68
arpi
parents:
diff changeset
69 static int init(sh_audio_t *sh_audio){
arpi
parents:
diff changeset
70 // initialize the decoder, set tables etc...
arpi
parents:
diff changeset
71
arpi
parents:
diff changeset
72 // you can store HANDLE or private struct pointer at sh->context
arpi
parents:
diff changeset
73 // you can access WAVEFORMATEX header at sh->wf
arpi
parents:
diff changeset
74
arpi
parents:
diff changeset
75 // set sample format/rate parameters if you didn't do it in preinit() yet.
arpi
parents:
diff changeset
76
arpi
parents:
diff changeset
77 return 1; // return values: 1=OK 0=ERROR
arpi
parents:
diff changeset
78 }
arpi
parents:
diff changeset
79
arpi
parents:
diff changeset
80 static void uninit(sh_audio_t *sh){
arpi
parents:
diff changeset
81 // uninit the decoder etc...
arpi
parents:
diff changeset
82 // again: you don't have to free() a_in_buffer here! it's done by the core.
arpi
parents:
diff changeset
83 }
arpi
parents:
diff changeset
84
arpi
parents:
diff changeset
85 static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen){
arpi
parents:
diff changeset
86
arpi
parents:
diff changeset
87 // audio decoding. the most important thing :)
arpi
parents:
diff changeset
88 // parameters you get:
arpi
parents:
diff changeset
89 // buf = pointer to the output buffer, you have to store uncompressed
arpi
parents:
diff changeset
90 // samples there
arpi
parents:
diff changeset
91 // minlen = requested minimum size (in bytes!) of output. it's just a
arpi
parents:
diff changeset
92 // _recommendation_, you can decode more or less, it just tell you that
arpi
parents:
diff changeset
93 // the caller process needs 'minlen' bytes. if it gets less, it will
arpi
parents:
diff changeset
94 // call decode_audio() again.
arpi
parents:
diff changeset
95 // maxlen = maximum size (bytes) of output. you MUST NOT write more to the
arpi
parents:
diff changeset
96 // buffer, it's the upper-most limit!
arpi
parents:
diff changeset
97 // note: maxlen will be always greater or equal to sh->audio_out_minsize
arpi
parents:
diff changeset
98
arpi
parents:
diff changeset
99 // now, let's decode...
arpi
parents:
diff changeset
100
arpi
parents:
diff changeset
101 // you can read the compressed stream using the demux stream functions:
arpi
parents:
diff changeset
102 // demux_read_data(sh->ds, buffer, length) - read 'length' bytes to 'buffer'
arpi
parents:
diff changeset
103 // ds_get_packet(sh->ds, &buffer) - set ptr buffer to next data packet
arpi
parents:
diff changeset
104 // (both func return number of bytes or 0 for error)
arpi
parents:
diff changeset
105
arpi
parents:
diff changeset
106 return len; // return value: number of _bytes_ written to output buffer,
arpi
parents:
diff changeset
107 // or -1 for EOF (or uncorrectable error)
arpi
parents:
diff changeset
108 }
arpi
parents:
diff changeset
109
arpi
parents:
diff changeset
110 static int control(sh_audio_t *sh,int cmd,void* arg, ...){
arpi
parents:
diff changeset
111 // various optional functions you MAY implement:
arpi
parents:
diff changeset
112 switch(cmd){
arpi
parents:
diff changeset
113 case ADCTRL_RESYNC_STREAM:
arpi
parents:
diff changeset
114 // it is called once after seeking, to resync.
6049
4bae3caef7a9 always reser audio input buffer pointer
arpi
parents: 5462
diff changeset
115 // Note: sh_audio->a_in_buffer_len=0; is done _before_ this call!
5462
arpi
parents:
diff changeset
116 ...
arpi
parents:
diff changeset
117 return CONTROL_TRUE;
arpi
parents:
diff changeset
118 case ADCTRL_SKIP_FRAME:
arpi
parents:
diff changeset
119 // it is called to skip (jump over) small amount (1/10 sec or 1 frame)
arpi
parents:
diff changeset
120 // of audio data - used to sync audio to video after seeking
arpi
parents:
diff changeset
121 // if you don't return CONTROL_TRUE, it will defaults to:
arpi
parents:
diff changeset
122 // ds_fill_buffer(sh_audio->ds); // skip 1 demux packet
arpi
parents:
diff changeset
123 ...
arpi
parents:
diff changeset
124 return CONTROL_TRUE;
arpi
parents:
diff changeset
125 }
arpi
parents:
diff changeset
126 return CONTROL_UNKNOWN;
arpi
parents:
diff changeset
127 }