annotate libmpcodecs/ae_lavc.c @ 15533:ddf15d233d58

Do not switch to audio tracks whose codec private data differs from the main audio track's as this will most likely result in messed up audio output. Patch by Michael Behrisch <list () behrisch ! de>
author mosu
date Sat, 21 May 2005 06:50:08 +0000
parents 7cdc07507650
children 6ff3379a0862
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"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
8 #include "../mp_msg.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
9 #include "aviheader.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
10 #include "ms_hdr.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
11 #include "muxer.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
12 #include "ae_lavc.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
13 #include "help_mp.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
14 #include "../config.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
15 #include "../libaf/af_format.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
16 #ifdef USE_LIBAVCODEC_SO
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
17 #include <ffmpeg/avcodec.h>
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
18 #else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
19 #include "libavcodec/avcodec.h"
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
20 #endif
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
21
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
22 static AVCodec *lavc_acodec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
23 static AVCodecContext *lavc_actx;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
24 extern char *lavc_param_acodec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
25 extern int lavc_param_abitrate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
26 extern int lavc_param_atag;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
27 extern int avcodec_inited;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
28 static int compressed_frame_size = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
29
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
30 static int bind_lavc(audio_encoder_t *encoder, muxer_stream_t *mux_a)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
31 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
32 mux_a->wf = malloc(sizeof(WAVEFORMATEX)+lavc_actx->extradata_size+256);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
33 mux_a->wf->wFormatTag = lavc_param_atag;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
34 mux_a->wf->nChannels = lavc_actx->channels;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
35 mux_a->wf->nSamplesPerSec = lavc_actx->sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
36 mux_a->wf->nAvgBytesPerSec = (lavc_actx->bit_rate / 8);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
37 mux_a->h.dwRate = mux_a->wf->nAvgBytesPerSec;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
38 if(lavc_actx->block_align)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
39 mux_a->h.dwSampleSize = mux_a->h.dwScale = lavc_actx->block_align;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
40 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
41 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
42 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
43
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
44 if ((mux_a->wf->nAvgBytesPerSec *
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
45 lavc_actx->frame_size) % mux_a->wf->nSamplesPerSec)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
46 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
47 mux_a->h.dwScale = lavc_actx->frame_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
48 mux_a->h.dwRate = lavc_actx->sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
49 mux_a->h.dwSampleSize = 0; // Blocksize not constant
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
50 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
51 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
52 mux_a->h.dwSampleSize = mux_a->h.dwScale;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
53 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
54 mux_a->wf->nBlockAlign = mux_a->h.dwScale;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
55 mux_a->h.dwSuggestedBufferSize = (encoder->params.audio_preload*mux_a->wf->nAvgBytesPerSec)/1000;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
56 mux_a->h.dwSuggestedBufferSize -= mux_a->h.dwSuggestedBufferSize % mux_a->wf->nBlockAlign;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
57
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
58 switch(lavc_param_atag)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
59 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
60 case 0x11: /* imaadpcm */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
61 mux_a->wf->wBitsPerSample = 4;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
62 mux_a->wf->cbSize = 2;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
63 ((uint16_t*)mux_a->wf)[sizeof(WAVEFORMATEX)] =
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
64 ((lavc_actx->block_align - 4 * lavc_actx->channels) / (4 * lavc_actx->channels)) * 8 + 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
65 break;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
66 case 0x55: /* mp3 */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
67 mux_a->wf->cbSize = 12;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
68 mux_a->wf->wBitsPerSample = 0; /* does not apply */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
69 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->wID = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
70 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->fdwFlags = 2;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
71 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nBlockSize = mux_a->wf->nBlockAlign;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
72 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nFramesPerBlock = 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
73 ((MPEGLAYER3WAVEFORMAT *) (mux_a->wf))->nCodecDelay = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
74 break;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
75 default:
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
76 mux_a->wf->wBitsPerSample = 0; /* Unknown */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
77 if (lavc_actx->extradata && (lavc_actx->extradata_size > 0))
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
78 {
15501
7cdc07507650 wrong memcpy of extradata; 10l to whomever wrote that broken code
nicodvb
parents: 15244
diff changeset
79 memcpy(mux_a->wf+1, lavc_actx->extradata, lavc_actx->extradata_size);
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
80 mux_a->wf->cbSize = lavc_actx->extradata_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
81 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
82 else
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
83 mux_a->wf->cbSize = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
84 break;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
85 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
86
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
87 // Fix allocation
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
88 mux_a->wf = realloc(mux_a->wf, sizeof(WAVEFORMATEX)+mux_a->wf->cbSize);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
89
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
90 encoder->input_format = AF_FORMAT_S16_NE;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
91 encoder->min_buffer_size = mux_a->h.dwSuggestedBufferSize;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
92 encoder->max_buffer_size = mux_a->h.dwSuggestedBufferSize*2;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
93
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
94 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
95 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
96
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
97 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
98 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
99 int n;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
100 n = avcodec_encode_audio(lavc_actx, dest, size, src);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
101 if(n > compressed_frame_size)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
102 compressed_frame_size = n; //it's valid because lavc encodes in cbr mode
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
103 return n;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
104 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
105
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
106
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
107 static int close_lavc(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
108 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
109 compressed_frame_size = 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
110 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
111 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
112
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
113 static int get_frame_size(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
114 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
115 return compressed_frame_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
116 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
117
15244
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
118 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
119 {
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
120 if(codec == NULL)
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
121 return 0;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
122
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
123 if(! strcasecmp(codec, "mp2"))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
124 return 0x50;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
125
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
126 if(! strcasecmp(codec, "mp3"))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
127 return 0x55;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
128
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
129 if(! strcasecmp(codec, "ac3"))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
130 return 0x2000;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
131
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
132 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
133 return 0x11;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
134
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
135 if(! strncasecmp(codec, "bonk", 4))
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
136 return 0x2048;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
137
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
138 return 0;
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
139 }
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
140
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
141
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
142 int mpae_init_lavc(audio_encoder_t *encoder)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
143 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
144 encoder->params.samples_per_frame = encoder->params.sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
145 encoder->params.bitrate = encoder->params.sample_rate * encoder->params.channels * 2 * 8;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
146
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
147 if(!lavc_param_acodec)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
148 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
149 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_NoLavcAudioCodecName);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
150 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
151 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
152
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
153 if(!avcodec_inited){
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
154 avcodec_init();
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
155 avcodec_register_all();
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
156 avcodec_inited=1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
157 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
158
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
159 lavc_acodec = avcodec_find_encoder_by_name(lavc_param_acodec);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
160 if (!lavc_acodec)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
161 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
162 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_LavcAudioCodecNotFound, lavc_param_acodec);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
163 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
164 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
165 if(lavc_param_atag == 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
166 {
15244
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
167 #ifdef USE_LIBAVFORMAT
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
168 lavc_param_atag = codec_get_wav_tag(lavc_acodec->id);
15244
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
169 #else
a8a8a4d69a1c restore old lavc_find_atag to be used when compiling mplayer without libavformat
nicodvb
parents: 15240
diff changeset
170 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
171 #endif
15234
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
172 if(!lavc_param_atag)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
173 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
174 mp_msg(MSGT_MENCODER, MSGL_FATAL, "Couldn't find wav tag for specified codec, exit\n");
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
175 return 0;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
176 }
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_actx = avcodec_alloc_context();
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
180 if(lavc_actx == NULL)
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_CouldntAllocateLavcContext);
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
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
186 // put sample parameters
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
187 lavc_actx->channels = encoder->params.channels;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
188 lavc_actx->sample_rate = encoder->params.sample_rate;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
189 lavc_actx->bit_rate = encoder->params.bitrate = lavc_param_abitrate * 1000;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
190
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
191
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
192 /*
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
193 * Special case for adpcm_ima_wav.
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
194 * The bitrate is only dependant on samplerate.
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
195 * We have to known frame_size and block_align in advance,
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
196 * so I just copied the code from libavcodec/adpcm.c
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
197 *
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
198 * However, ms adpcm_ima_wav uses a block_align of 2048,
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
199 * lavc defaults to 1024
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
200 */
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
201 if(lavc_param_atag == 0x11) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
202 int blkalign = 2048;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
203 int framesize = (blkalign - 4 * lavc_actx->channels) * 8 / (4 * lavc_actx->channels) + 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
204 lavc_actx->bit_rate = lavc_actx->sample_rate*8*blkalign/framesize;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
205 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
206
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
207 if(avcodec_open(lavc_actx, lavc_acodec) < 0)
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
208 {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
209 mp_msg(MSGT_MENCODER, MSGL_FATAL, MSGTR_CouldntOpenCodec, lavc_param_acodec, lavc_param_abitrate);
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
210 return 0;
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 if(lavc_param_atag == 0x11) {
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
214 lavc_actx->block_align = 2048;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
215 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
216 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
217
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
218 encoder->decode_buffer_size = lavc_actx->frame_size * 2 * encoder->params.channels;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
219 encoder->bind = bind_lavc;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
220 encoder->get_frame_size = get_frame_size;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
221 encoder->encode = encode_lavc;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
222 encoder->close = close_lavc;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
223
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
224 return 1;
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
225 }
e84a6ae9d51e audio encoding reworked
nicodvb
parents:
diff changeset
226