annotate libmpcodecs/ae_lavc.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 30b770392f2c
children dfa8a510c81c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
1 #include <stdio.h>
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
2 #include <stdlib.h>
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
3 #include <inttypes.h>
15238
2cc48c37a7eb FreeBSD fix
nexus
parents: 15234
diff changeset
4 #include <unistd.h>
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
5 #include <string.h>
15240
6d6792c02b6f macosx compilation fix
nicodvb
parents: 15238
diff changeset
6 #include <sys/types.h>
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
7 #include "m_option.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15501
diff changeset
8 #include "mp_msg.h"
22601
ed8f90096c65 Add explicit location for headers from the libmpdemux/ directory.
diego
parents: 22600
diff changeset
9 #include "libmpdemux/aviheader.h"
ed8f90096c65 Add explicit location for headers from the libmpdemux/ directory.
diego
parents: 22600
diff changeset
10 #include "libmpdemux/ms_hdr.h"
22600
3c2b4a866c6a Add explicit location for headers from the stream/ directory.
diego
parents: 22316
diff changeset
11 #include "stream/stream.h"
22601
ed8f90096c65 Add explicit location for headers from the libmpdemux/ directory.
diego
parents: 22600
diff changeset
12 #include "libmpdemux/muxer.h"
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
13 #include "ae_lavc.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
14 #include "help_mp.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15501
diff changeset
15 #include "config.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 15501
diff changeset
16 #include "libaf/af_format.h"
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
17 #ifdef USE_LIBAVCODEC_SO
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
18 #include <ffmpeg/avcodec.h>
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
19 #else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
20 #include "libavcodec/avcodec.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
21 #endif
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
22
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
23 static AVCodec *lavc_acodec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
24 static AVCodecContext *lavc_actx;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
25 extern char *lavc_param_acodec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
26 extern int lavc_param_abitrate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
27 extern int lavc_param_atag;
17842
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
28 extern int lavc_param_audio_global_header;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
29 extern int avcodec_inited;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
30 static int compressed_frame_size = 0;
23121
a257dd426da5 Simplify preprocessor directives: There is a general variable for
diego
parents: 22601
diff changeset
31 #ifdef USE_LIBAVFORMAT
21820
cd705f30bb31 Include libavformat/riff.h when building with static libavformat and
reimar
parents: 21773
diff changeset
32 #ifdef USE_LIBAVFORMAT_SO
cd705f30bb31 Include libavformat/riff.h when building with static libavformat and
reimar
parents: 21773
diff changeset
33 #include <ffmpeg/avformat.h>
cd705f30bb31 Include libavformat/riff.h when building with static libavformat and
reimar
parents: 21773
diff changeset
34 #else
cd705f30bb31 Include libavformat/riff.h when building with static libavformat and
reimar
parents: 21773
diff changeset
35 #include "libavformat/avformat.h"
21822
fc4ce8a91a2e Include "internal" libavformat/riff.h also when dynamic libavformat is used
reimar
parents: 21820
diff changeset
36 #endif
21966
d9494ca70ca7 Simplify by using av_codec_get_id and include riff.h only in demux_lavf.c
reimar
parents: 21963
diff changeset
37 extern const struct AVCodecTag *mp_wav_taglists[];
17096
rathann
parents: 17012
diff changeset
38 #endif
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
39
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
40 static int bind_lavc(audio_encoder_t *encoder, muxer_stream_t *mux_a)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
41 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
42 mux_a->wf = malloc(sizeof(WAVEFORMATEX)+lavc_actx->extradata_size+256);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
43 mux_a->wf->wFormatTag = lavc_param_atag;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
44 mux_a->wf->nChannels = lavc_actx->channels;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
45 mux_a->wf->nSamplesPerSec = lavc_actx->sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
46 mux_a->wf->nAvgBytesPerSec = (lavc_actx->bit_rate / 8);
19360
d4d72e5eea07 pass average bitrate from encoder to (lavf) muxer
michael
parents: 17855
diff changeset
47 mux_a->avg_rate= lavc_actx->bit_rate;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
48 mux_a->h.dwRate = mux_a->wf->nAvgBytesPerSec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
49 if(lavc_actx->block_align)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
50 mux_a->h.dwSampleSize = mux_a->h.dwScale = lavc_actx->block_align;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
51 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
52 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
53 mux_a->h.dwScale = (mux_a->wf->nAvgBytesPerSec * lavc_actx->frame_size)/ mux_a->wf->nSamplesPerSec; /* for cbr */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
54
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
55 if ((mux_a->wf->nAvgBytesPerSec *
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
56 lavc_actx->frame_size) % mux_a->wf->nSamplesPerSec)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
57 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
58 mux_a->h.dwScale = lavc_actx->frame_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
59 mux_a->h.dwRate = lavc_actx->sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
60 mux_a->h.dwSampleSize = 0; // Blocksize not constant
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
61 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
62 else
21773
03bc990498fc the avi spec does not allow random samplesize whoever wrote this should be shot
michael
parents: 21771
diff changeset
63 mux_a->h.dwSampleSize = 0;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
64 }
21773
03bc990498fc the avi spec does not allow random samplesize whoever wrote this should be shot
michael
parents: 21771
diff changeset
65 if(mux_a->h.dwSampleSize)
03bc990498fc the avi spec does not allow random samplesize whoever wrote this should be shot
michael
parents: 21771
diff changeset
66 mux_a->wf->nBlockAlign = mux_a->h.dwSampleSize;
03bc990498fc the avi spec does not allow random samplesize whoever wrote this should be shot
michael
parents: 21771
diff changeset
67 else
03bc990498fc the avi spec does not allow random samplesize whoever wrote this should be shot
michael
parents: 21771
diff changeset
68 mux_a->wf->nBlockAlign = 1;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
69 mux_a->h.dwSuggestedBufferSize = (encoder->params.audio_preload*mux_a->wf->nAvgBytesPerSec)/1000;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
70 mux_a->h.dwSuggestedBufferSize -= mux_a->h.dwSuggestedBufferSize % mux_a->wf->nBlockAlign;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
71
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
72 switch(lavc_param_atag)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
73 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
74 case 0x11: /* imaadpcm */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
75 mux_a->wf->wBitsPerSample = 4;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
76 mux_a->wf->cbSize = 2;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
77 ((uint16_t*)mux_a->wf)[sizeof(WAVEFORMATEX)] =
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
78 ((lavc_actx->block_align - 4 * lavc_actx->channels) / (4 * lavc_actx->channels)) * 8 + 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
79 break;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
80 case 0x55: /* mp3 */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
81 mux_a->wf->cbSize = 12;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
82 mux_a->wf->wBitsPerSample = 0; /* does not apply */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
83 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->wID = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
84 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->fdwFlags = 2;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
85 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nBlockSize = mux_a->wf->nBlockAlign;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
86 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nFramesPerBlock = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
87 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nCodecDelay = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
88 break;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
89 default:
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
90 mux_a->wf->wBitsPerSample = 0; /* Unknown */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
91 if (lavc_actx->extradata && (lavc_actx->extradata_size > 0))
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
92 {
15501
7cdc07507650 wrong memcpy of extradata; 10l to whomever wrote that broken code
nicodvb
parents: 15244
diff changeset
93 memcpy(mux_a->wf+1, lavc_actx->extradata, lavc_actx->extradata_size);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
94 mux_a->wf->cbSize = lavc_actx->extradata_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
95 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
96 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
97 mux_a->wf->cbSize = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
98 break;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
99 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
100
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
101 // Fix allocation
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
102 mux_a->wf = realloc(mux_a->wf, sizeof(WAVEFORMATEX)+mux_a->wf->cbSize);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
103
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
104 encoder->input_format = AF_FORMAT_S16_NE;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
105 encoder->min_buffer_size = mux_a->h.dwSuggestedBufferSize;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
106 encoder->max_buffer_size = mux_a->h.dwSuggestedBufferSize*2;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
107
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
108 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
109 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
110
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
111 static int encode_lavc(audio_encoder_t *encoder, uint8_t *dest, void *src, int size, int max_size)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
112 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
113 int n;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
114 n = avcodec_encode_audio(lavc_actx, dest, size, src);
17855
4b1930c9345c do not randomly chop up packets, this isnt allowed in almost no container
michael
parents: 17842
diff changeset
115 compressed_frame_size = n;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
116 return n;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
117 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
118
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
119
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
120 static int close_lavc(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
121 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
122 compressed_frame_size = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
123 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
124 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
125
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
126 static int get_frame_size(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
127 {
17855
4b1930c9345c do not randomly chop up packets, this isnt allowed in almost no container
michael
parents: 17842
diff changeset
128 int sz = compressed_frame_size;
4b1930c9345c do not randomly chop up packets, this isnt allowed in almost no container
michael
parents: 17842
diff changeset
129 compressed_frame_size = 0;
4b1930c9345c do not randomly chop up packets, this isnt allowed in almost no container
michael
parents: 17842
diff changeset
130 return sz;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
131 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
132
24359
30b770392f2c warning fix:
diego
parents: 23957
diff changeset
133 #ifndef USE_LIBAVFORMAT
15244
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
134 static uint32_t lavc_find_atag(char *codec)
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
135 {
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
136 if(codec == NULL)
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
137 return 0;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
138
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
139 if(! strcasecmp(codec, "mp2"))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
140 return 0x50;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
141
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
142 if(! strcasecmp(codec, "mp3"))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
143 return 0x55;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
144
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
145 if(! strcasecmp(codec, "ac3"))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
146 return 0x2000;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
147
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
148 if(! strcasecmp(codec, "adpcm_ima_wav"))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
149 return 0x11;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
150
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
151 if(! strncasecmp(codec, "bonk", 4))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
152 return 0x2048;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
153
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
154 return 0;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
155 }
24359
30b770392f2c warning fix:
diego
parents: 23957
diff changeset
156 #endif
15244
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
157
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
158
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
159 int mpae_init_lavc(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
160 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
161 encoder->params.samples_per_frame = encoder->params.sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
162 encoder->params.bitrate = encoder->params.sample_rate * encoder->params.channels * 2 * 8;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
163
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
164 if(!lavc_param_acodec)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
165 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
166 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_NoLavcAudioCodecName);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
167 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
168 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
169
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
170 if(!avcodec_inited){
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
171 avcodec_init();
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
172 avcodec_register_all();
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
173 avcodec_inited=1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
174 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
175
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
176 lavc_acodec = avcodec_find_encoder_by_name(lavc_param_acodec);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
177 if (!lavc_acodec)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
178 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
179 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LavcAudioCodecNotFound, lavc_param_acodec);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
180 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
181 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
182 if(lavc_param_atag == 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
183 {
23121
a257dd426da5 Simplify preprocessor directives: There is a general variable for
diego
parents: 22601
diff changeset
184 #ifdef USE_LIBAVFORMAT
21966
d9494ca70ca7 Simplify by using av_codec_get_id and include riff.h only in demux_lavf.c
reimar
parents: 21963
diff changeset
185 lavc_param_atag = av_codec_get_tag(mp_wav_taglists, lavc_acodec->id);
15244
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
186 #else
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
187 lavc_param_atag = lavc_find_atag(lavc_param_acodec);
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
188 #endif
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
189 if(!lavc_param_atag)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
190 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
191 mp_msg(MSGT_MENCODER, MSGL_FATAL, "Couldn't find wav tag for specified codec, exit\n");
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
192 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
193 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
194 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
195
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
196 lavc_actx = avcodec_alloc_context();
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
197 if(lavc_actx == NULL)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
198 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
199 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_CouldntAllocateLavcContext);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
200 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
201 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
202
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
203 // put sample parameters
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
204 lavc_actx->channels = encoder->params.channels;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
205 lavc_actx->sample_rate = encoder->params.sample_rate;
23957
74eb6825d332 allow to specify the audio bitrate in bits (some codecs need that ...)
michael
parents: 23121
diff changeset
206 if(lavc_param_abitrate<1000)
74eb6825d332 allow to specify the audio bitrate in bits (some codecs need that ...)
michael
parents: 23121
diff changeset
207 lavc_actx->bit_rate = encoder->params.bitrate = lavc_param_abitrate * 1000;
74eb6825d332 allow to specify the audio bitrate in bits (some codecs need that ...)
michael
parents: 23121
diff changeset
208 else
74eb6825d332 allow to specify the audio bitrate in bits (some codecs need that ...)
michael
parents: 23121
diff changeset
209 lavc_actx->bit_rate = encoder->params.bitrate = lavc_param_abitrate;
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
210
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
211
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
212 /*
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
213 * Special case for adpcm_ima_wav.
22316
f3d7a1b58a82 cosmetics: Fix some common typos, appropiate --> appropRiate,
diego
parents: 21966
diff changeset
214 * The bitrate is only dependent on samplerate.
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
215 * We have to known frame_size and block_align in advance,
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
216 * so I just copied the code from libavcodec/adpcm.c
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
217 *
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
218 * However, ms adpcm_ima_wav uses a block_align of 2048,
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
219 * lavc defaults to 1024
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
220 */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
221 if(lavc_param_atag == 0x11) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
222 int blkalign = 2048;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
223 int framesize = (blkalign - 4 * lavc_actx->channels) * 8 / (4 * lavc_actx->channels) + 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
224 lavc_actx->bit_rate = lavc_actx->sample_rate*8*blkalign/framesize;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
225 }
17842
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
226 if((lavc_param_audio_global_header&1)
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
227 /*|| (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))*/){
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
228 lavc_actx->flags |= CODEC_FLAG_GLOBAL_HEADER;
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
229 }
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
230 if(lavc_param_audio_global_header&2){
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
231 lavc_actx->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
7d5343254436 -lavcopts aglobal
michael
parents: 17354
diff changeset
232 }
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
233
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
234 if(avcodec_open(lavc_actx, lavc_acodec) < 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
235 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
236 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_CouldntOpenCodec, lavc_param_acodec, lavc_param_abitrate);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
237 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
238 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
239
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
240 if(lavc_param_atag == 0x11) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
241 lavc_actx->block_align = 2048;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
242 lavc_actx->frame_size = (lavc_actx->block_align - 4 * lavc_actx->channels) * 8 / (4 * lavc_actx->channels) + 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
243 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
244
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
245 encoder->decode_buffer_size = lavc_actx->frame_size * 2 * encoder->params.channels;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
246 encoder->bind = bind_lavc;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
247 encoder->get_frame_size = get_frame_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
248 encoder->encode = encode_lavc;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
249 encoder->close = close_lavc;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
250
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
251 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
252 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
253