annotate libmpcodecs/ae_lavc.c @ 27249:4be2b34aa431

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