annotate libmpcodecs/ad_ffmpeg.c @ 32972:fbaae7fe1a13

Fix several issues with Translate(). 1. The "Unsafe!" comment has been removed, because the strings passed to the function are strcpy'd. 2. The needless memsets (one of which with wrong size) have been removed in favor of a sufficiently simple initialization of trbuf. 3. The array indices are unsigned now, and the manual optimization of having strlen() outside the for loop has been removed in favor of optimization performed by the compiler. 4. There is a check now to prevent an out-of-bounds array access.
author ib
date Tue, 08 Mar 2011 20:56:51 +0000
parents e3dfc7e2b0f8
children e2382d88fb7f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
30421
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
1 /*
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
2 * This file is part of MPlayer.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
3 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
4 * MPlayer is free software; you can redistribute it and/or modify
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
5 * it under the terms of the GNU General Public License as published by
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
7 * (at your option) any later version.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
8 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
12 * GNU General Public License for more details.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
13 *
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
14 * You should have received a copy of the GNU General Public License along
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
17 */
bbb6ebec87a0 Add missing license headers to all files in the libmpcodecs directory.
diego
parents: 30379
diff changeset
18
32942
e3dfc7e2b0f8 Fix dnet decoding with -ac ffac3, the data needs to be byte-swapped.
reimar
parents: 32906
diff changeset
19 #define _XOPEN_SOURCE 600
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
20 #include <stdio.h>
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
21 #include <stdlib.h>
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
22 #include <unistd.h>
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
23
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
24 #include "config.h"
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
25 #include "mp_msg.h"
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
26 #include "help_mp.h"
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
27
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
28 #include "ad_internal.h"
31986
9986a61354e6 Remove duplicated audio_output_channels extern variable declaration.
diego
parents: 31959
diff changeset
29 #include "dec_audio.h"
31959
f957f330aa6d Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents: 31926
diff changeset
30 #include "vd_ffmpeg.h"
25315
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24226
diff changeset
31 #include "libaf/reorder_ch.h"
32906
b623edea8e3c Use samplefmt2affmt helper function in ad_ffmpeg.c
reimar
parents: 32768
diff changeset
32 #include "fmt-conversion.h"
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
33
21507
fa99b3d31d13 Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents: 21372
diff changeset
34 #include "mpbswap.h"
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
35
30504
cc27da5d7286 Mark all ad_info_t/vd_info_t structure declarations as const.
diego
parents: 30421
diff changeset
36 static const ad_info_t info =
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
37 {
7191
1eadce15446c -afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents: 7180
diff changeset
38 "FFmpeg/libavcodec audio decoders",
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
39 "ffmpeg",
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
40 "Nick Kurshev",
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
41 "ffmpeg.sf.net",
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
42 ""
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
43 };
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
44
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
45 LIBAD_EXTERN(ffmpeg)
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
46
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
47 #define assert(x)
5447
63082aa173f8 using sh->context
alex
parents: 5343
diff changeset
48
26069
1318e956c092 FFmpeg now uses different (unified) #include paths.
diego
parents: 25962
diff changeset
49 #include "libavcodec/avcodec.h"
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
50
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
51
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
52 static int preinit(sh_audio_t *sh)
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
53 {
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
54 sh->audio_out_minsize=AVCODEC_MAX_AUDIO_FRAME_SIZE;
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
55 return 1;
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
56 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
57
31671
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
58 static int setup_format(sh_audio_t *sh_audio, const AVCodecContext *lavc_context)
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
59 {
32390
b33aed46ecda Avoid printing AAC with SBR warning on every decode call, instead print
reimar
parents: 32387
diff changeset
60 int broken_srate = 0;
31671
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
61 int samplerate = lavc_context->sample_rate;
32906
b623edea8e3c Use samplefmt2affmt helper function in ad_ffmpeg.c
reimar
parents: 32768
diff changeset
62 int sample_format = samplefmt2affmt(lavc_context->sample_fmt);
b623edea8e3c Use samplefmt2affmt helper function in ad_ffmpeg.c
reimar
parents: 32768
diff changeset
63 if (!sample_format)
b623edea8e3c Use samplefmt2affmt helper function in ad_ffmpeg.c
reimar
parents: 32768
diff changeset
64 sample_format = sh_audio->sample_format;
31671
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
65 if(sh_audio->wf){
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
66 // If the decoder uses the wrong number of channels all is lost anyway.
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
67 // sh_audio->channels=sh_audio->wf->nChannels;
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
68
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
69 if (lavc_context->codec_id == CODEC_ID_AAC &&
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
70 samplerate == 2*sh_audio->wf->nSamplesPerSec) {
32390
b33aed46ecda Avoid printing AAC with SBR warning on every decode call, instead print
reimar
parents: 32387
diff changeset
71 broken_srate = 1;
31671
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
72 } else if (sh_audio->wf->nSamplesPerSec)
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
73 samplerate=sh_audio->wf->nSamplesPerSec;
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
74 }
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
75 if (lavc_context->channels != sh_audio->channels ||
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
76 samplerate != sh_audio->samplerate ||
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
77 sample_format != sh_audio->sample_format) {
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
78 sh_audio->channels=lavc_context->channels;
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
79 sh_audio->samplerate=samplerate;
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
80 sh_audio->sample_format = sample_format;
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
81 sh_audio->samplesize=af_fmt2bits(sh_audio->sample_format)/ 8;
32390
b33aed46ecda Avoid printing AAC with SBR warning on every decode call, instead print
reimar
parents: 32387
diff changeset
82 if (broken_srate)
b33aed46ecda Avoid printing AAC with SBR warning on every decode call, instead print
reimar
parents: 32387
diff changeset
83 mp_msg(MSGT_DECAUDIO, MSGL_WARN,
b33aed46ecda Avoid printing AAC with SBR warning on every decode call, instead print
reimar
parents: 32387
diff changeset
84 "Ignoring broken container sample rate for AAC with SBR\n");
31671
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
85 return 1;
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
86 }
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
87 return 0;
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
88 }
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
89
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
90 static int init(sh_audio_t *sh_audio)
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
91 {
29511
2c47c6dd92b5 Retry deciding to get audio parameters several times on errors, this avoids
reimar
parents: 29491
diff changeset
92 int tries = 0;
5447
63082aa173f8 using sh->context
alex
parents: 5343
diff changeset
93 int x;
5480
df12f6eb80e3 removed useless contect struct -> code simplified
arpi
parents: 5447
diff changeset
94 AVCodecContext *lavc_context;
df12f6eb80e3 removed useless contect struct -> code simplified
arpi
parents: 5447
diff changeset
95 AVCodec *lavc_codec;
5447
63082aa173f8 using sh->context
alex
parents: 5343
diff changeset
96
63082aa173f8 using sh->context
alex
parents: 5343
diff changeset
97 mp_msg(MSGT_DECAUDIO,MSGL_V,"FFmpeg's libavcodec audio codec\n");
31959
f957f330aa6d Introduce init_avcodec function to avoid duplicated FFmpeg initializations.
diego
parents: 31926
diff changeset
98 init_avcodec();
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29133
diff changeset
99
31926
45966266392b Remove pointless casts of avcodec_find_decoder_by_name() return value.
diego
parents: 31671
diff changeset
100 lavc_codec = avcodec_find_decoder_by_name(sh_audio->codec->dll);
5480
df12f6eb80e3 removed useless contect struct -> code simplified
arpi
parents: 5447
diff changeset
101 if(!lavc_codec){
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
102 mp_msg(MSGT_DECAUDIO,MSGL_ERR,MSGTR_MissingLAVCcodec,sh_audio->codec->dll);
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
103 return 0;
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
104 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29133
diff changeset
105
7940
26fd599d4bad pass extradata to the codec
arpi
parents: 7191
diff changeset
106 lavc_context = avcodec_alloc_context();
5480
df12f6eb80e3 removed useless contect struct -> code simplified
arpi
parents: 5447
diff changeset
107 sh_audio->context=lavc_context;
7940
26fd599d4bad pass extradata to the codec
arpi
parents: 7191
diff changeset
108
31220
002cdc635c03 Use the -a52drc option also for the libavcodec decoder.
reimar
parents: 31010
diff changeset
109 lavc_context->drc_scale = drc_level;
24226
352d7d9422b5 Set sample_rate and bit_rate from sh_audio as fallback in case sh_audio->wf
reimar
parents: 24108
diff changeset
110 lavc_context->sample_rate = sh_audio->samplerate;
352d7d9422b5 Set sample_rate and bit_rate from sh_audio as fallback in case sh_audio->wf
reimar
parents: 24108
diff changeset
111 lavc_context->bit_rate = sh_audio->i_bps * 8;
8590
0328af0565bf ffmp2 (with mpeg files) sig11 fixed
arpi
parents: 8108
diff changeset
112 if(sh_audio->wf){
0328af0565bf ffmp2 (with mpeg files) sig11 fixed
arpi
parents: 8108
diff changeset
113 lavc_context->channels = sh_audio->wf->nChannels;
0328af0565bf ffmp2 (with mpeg files) sig11 fixed
arpi
parents: 8108
diff changeset
114 lavc_context->sample_rate = sh_audio->wf->nSamplesPerSec;
0328af0565bf ffmp2 (with mpeg files) sig11 fixed
arpi
parents: 8108
diff changeset
115 lavc_context->bit_rate = sh_audio->wf->nAvgBytesPerSec * 8;
0328af0565bf ffmp2 (with mpeg files) sig11 fixed
arpi
parents: 8108
diff changeset
116 lavc_context->block_align = sh_audio->wf->nBlockAlign;
27516
3364aef9a988 Fix compilation after libavcodec major version 52 changes
uau
parents: 26987
diff changeset
117 lavc_context->bits_per_coded_sample = sh_audio->wf->wBitsPerSample;
8590
0328af0565bf ffmp2 (with mpeg files) sig11 fixed
arpi
parents: 8108
diff changeset
118 }
24108
51cd49ee92d6 Use new request_channels
reimar
parents: 23978
diff changeset
119 lavc_context->request_channels = audio_output_channels;
9547
3b3b7b6fdb22 merging fourcc with codec_tag
michael
parents: 8590
diff changeset
120 lavc_context->codec_tag = sh_audio->format; //FOURCC
32768
3544ba7244bf Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents: 32767
diff changeset
121 lavc_context->codec_type = AVMEDIA_TYPE_AUDIO;
8590
0328af0565bf ffmp2 (with mpeg files) sig11 fixed
arpi
parents: 8108
diff changeset
122 lavc_context->codec_id = lavc_codec->id; // not sure if required, imho not --A'rpi
7940
26fd599d4bad pass extradata to the codec
arpi
parents: 7191
diff changeset
123
26fd599d4bad pass extradata to the codec
arpi
parents: 7191
diff changeset
124 /* alloc extra data */
8590
0328af0565bf ffmp2 (with mpeg files) sig11 fixed
arpi
parents: 8108
diff changeset
125 if (sh_audio->wf && sh_audio->wf->cbSize > 0) {
17226
255b14c0bc36 malloc padding to avoid access beyond allocated memory
henry
parents: 16165
diff changeset
126 lavc_context->extradata = av_mallocz(sh_audio->wf->cbSize + FF_INPUT_BUFFER_PADDING_SIZE);
7940
26fd599d4bad pass extradata to the codec
arpi
parents: 7191
diff changeset
127 lavc_context->extradata_size = sh_audio->wf->cbSize;
32105
c08363dc5320 Replace sizoef(type) by sizeof(*ptrvar).
reimar
parents: 31986
diff changeset
128 memcpy(lavc_context->extradata, sh_audio->wf + 1,
7940
26fd599d4bad pass extradata to the codec
arpi
parents: 7191
diff changeset
129 lavc_context->extradata_size);
26fd599d4bad pass extradata to the codec
arpi
parents: 7191
diff changeset
130 }
26fd599d4bad pass extradata to the codec
arpi
parents: 7191
diff changeset
131
14633
bde5c3261037 pass wave extradata to the codec..
alex
parents: 14431
diff changeset
132 // for QDM2
bde5c3261037 pass wave extradata to the codec..
alex
parents: 14431
diff changeset
133 if (sh_audio->codecdata_len && sh_audio->codecdata && !lavc_context->extradata)
bde5c3261037 pass wave extradata to the codec..
alex
parents: 14431
diff changeset
134 {
bde5c3261037 pass wave extradata to the codec..
alex
parents: 14431
diff changeset
135 lavc_context->extradata = av_malloc(sh_audio->codecdata_len);
bde5c3261037 pass wave extradata to the codec..
alex
parents: 14431
diff changeset
136 lavc_context->extradata_size = sh_audio->codecdata_len;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29133
diff changeset
137 memcpy(lavc_context->extradata, (char *)sh_audio->codecdata,
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29133
diff changeset
138 lavc_context->extradata_size);
14633
bde5c3261037 pass wave extradata to the codec..
alex
parents: 14431
diff changeset
139 }
bde5c3261037 pass wave extradata to the codec..
alex
parents: 14431
diff changeset
140
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
141 /* open it */
5480
df12f6eb80e3 removed useless contect struct -> code simplified
arpi
parents: 5447
diff changeset
142 if (avcodec_open(lavc_context, lavc_codec) < 0) {
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
143 mp_msg(MSGT_DECAUDIO,MSGL_ERR, MSGTR_CantOpenCodec);
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
144 return 0;
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
145 }
29928
731ddb53dc92 when using -v, print also which lavc codec has been used, not
attila
parents: 29913
diff changeset
146 mp_msg(MSGT_DECAUDIO,MSGL_V,"INFO: libavcodec \"%s\" init OK!\n", lavc_codec->name);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29133
diff changeset
147
8101
1bce6e325946 MACE fix
arpi
parents: 7958
diff changeset
148 // printf("\nFOURCC: 0x%X\n",sh_audio->format);
1bce6e325946 MACE fix
arpi
parents: 7958
diff changeset
149 if(sh_audio->format==0x3343414D){
1bce6e325946 MACE fix
arpi
parents: 7958
diff changeset
150 // MACE 3:1
1bce6e325946 MACE fix
arpi
parents: 7958
diff changeset
151 sh_audio->ds->ss_div = 2*3; // 1 samples/packet
8108
d9b2b39e5c06 Fix stereo MACE files
rtognimp
parents: 8101
diff changeset
152 sh_audio->ds->ss_mul = 2*sh_audio->wf->nChannels; // 1 byte*ch/packet
8101
1bce6e325946 MACE fix
arpi
parents: 7958
diff changeset
153 } else
1bce6e325946 MACE fix
arpi
parents: 7958
diff changeset
154 if(sh_audio->format==0x3643414D){
1bce6e325946 MACE fix
arpi
parents: 7958
diff changeset
155 // MACE 6:1
1bce6e325946 MACE fix
arpi
parents: 7958
diff changeset
156 sh_audio->ds->ss_div = 2*6; // 1 samples/packet
8108
d9b2b39e5c06 Fix stereo MACE files
rtognimp
parents: 8101
diff changeset
157 sh_audio->ds->ss_mul = 2*sh_audio->wf->nChannels; // 1 byte*ch/packet
8101
1bce6e325946 MACE fix
arpi
parents: 7958
diff changeset
158 }
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
159
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
160 // Decode at least 1 byte: (to get header filled)
29511
2c47c6dd92b5 Retry deciding to get audio parameters several times on errors, this avoids
reimar
parents: 29491
diff changeset
161 do {
29512
93da3c10c2ac Reindent
reimar
parents: 29511
diff changeset
162 x=decode_audio(sh_audio,sh_audio->a_buffer,1,sh_audio->a_buffer_size);
29511
2c47c6dd92b5 Retry deciding to get audio parameters several times on errors, this avoids
reimar
parents: 29491
diff changeset
163 } while (x <= 0 && tries++ < 5);
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
164 if(x>0) sh_audio->a_buffer_len=x;
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
165
5480
df12f6eb80e3 removed useless contect struct -> code simplified
arpi
parents: 5447
diff changeset
166 sh_audio->i_bps=lavc_context->bit_rate/8;
31671
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
167 if (sh_audio->wf && sh_audio->wf->nAvgBytesPerSec)
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
168 sh_audio->i_bps=sh_audio->wf->nAvgBytesPerSec;
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
169
28955
ee06f3a8b0d5 Support FFmpeg codecs that decode to other formats than S16.
reimar
parents: 27700
diff changeset
170 switch (lavc_context->sample_fmt) {
32768
3544ba7244bf Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents: 32767
diff changeset
171 case AV_SAMPLE_FMT_U8:
3544ba7244bf Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents: 32767
diff changeset
172 case AV_SAMPLE_FMT_S16:
3544ba7244bf Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents: 32767
diff changeset
173 case AV_SAMPLE_FMT_S32:
3544ba7244bf Change deprecated PKT_FLAG_KEY, CODEC_TYPE_* and SAMPLE_FMT_* to their
reimar
parents: 32767
diff changeset
174 case AV_SAMPLE_FMT_FLT:
31671
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
175 break;
28955
ee06f3a8b0d5 Support FFmpeg codecs that decode to other formats than S16.
reimar
parents: 27700
diff changeset
176 default:
ee06f3a8b0d5 Support FFmpeg codecs that decode to other formats than S16.
reimar
parents: 27700
diff changeset
177 return 0;
ee06f3a8b0d5 Support FFmpeg codecs that decode to other formats than S16.
reimar
parents: 27700
diff changeset
178 }
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
179 return 1;
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
180 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
181
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
182 static void uninit(sh_audio_t *sh)
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
183 {
7940
26fd599d4bad pass extradata to the codec
arpi
parents: 7191
diff changeset
184 AVCodecContext *lavc_context = sh->context;
26fd599d4bad pass extradata to the codec
arpi
parents: 7191
diff changeset
185
26fd599d4bad pass extradata to the codec
arpi
parents: 7191
diff changeset
186 if (avcodec_close(lavc_context) < 0)
5447
63082aa173f8 using sh->context
alex
parents: 5343
diff changeset
187 mp_msg(MSGT_DECVIDEO, MSGL_ERR, MSGTR_CantCloseCodec);
14431
0c10f923746e change malloc and free to av_ variants where needed.
reimar
parents: 13427
diff changeset
188 av_freep(&lavc_context->extradata);
0c10f923746e change malloc and free to av_ variants where needed.
reimar
parents: 13427
diff changeset
189 av_freep(&lavc_context);
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
190 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
191
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
192 static int control(sh_audio_t *sh,int cmd,void* arg, ...)
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
193 {
11977
efb37725d616 flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents: 9547
diff changeset
194 AVCodecContext *lavc_context = sh->context;
efb37725d616 flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents: 9547
diff changeset
195 switch(cmd){
efb37725d616 flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents: 9547
diff changeset
196 case ADCTRL_RESYNC_STREAM:
efb37725d616 flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents: 9547
diff changeset
197 avcodec_flush_buffers(lavc_context);
30379
0140d505dd91 Reset the parser on seek. Should fix some cases of audio "blips" after seeking.
reimar
parents: 30272
diff changeset
198 ds_clear_parser(sh->ds);
11977
efb37725d616 flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents: 9547
diff changeset
199 return CONTROL_TRUE;
efb37725d616 flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents: 9547
diff changeset
200 }
efb37725d616 flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents: 9547
diff changeset
201 return CONTROL_UNKNOWN;
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
202 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
203
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
204 static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen)
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
205 {
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
206 unsigned char *start=NULL;
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
207 int y,len=-1;
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
208 while(len<minlen){
29913
9e76a5f9e717 Switch ad_ffmpeg to avcodec_decode_audio3
reimar
parents: 29912
diff changeset
209 AVPacket pkt;
23456
1582297cc3d2 Use avcodec_decode_audio2 in ad_ffmpeg.c
reimar
parents: 21507
diff changeset
210 int len2=maxlen;
18242
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18150
diff changeset
211 double pts;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18150
diff changeset
212 int x=ds_get_packet_pts(sh_audio->ds,&start, &pts);
30088
4977e04f3a18 Add support for parsing audio streams (though should be easy to extend to video)
reimar
parents: 29928
diff changeset
213 if(x<=0) {
4977e04f3a18 Add support for parsing audio streams (though should be easy to extend to video)
reimar
parents: 29928
diff changeset
214 start = NULL;
4977e04f3a18 Add support for parsing audio streams (though should be easy to extend to video)
reimar
parents: 29928
diff changeset
215 x = 0;
4977e04f3a18 Add support for parsing audio streams (though should be easy to extend to video)
reimar
parents: 29928
diff changeset
216 ds_parse(sh_audio->ds, &start, &x, MP_NOPTS_VALUE, 0);
4977e04f3a18 Add support for parsing audio streams (though should be easy to extend to video)
reimar
parents: 29928
diff changeset
217 if (x <= 0)
4977e04f3a18 Add support for parsing audio streams (though should be easy to extend to video)
reimar
parents: 29928
diff changeset
218 break; // error
4977e04f3a18 Add support for parsing audio streams (though should be easy to extend to video)
reimar
parents: 29928
diff changeset
219 } else {
4977e04f3a18 Add support for parsing audio streams (though should be easy to extend to video)
reimar
parents: 29928
diff changeset
220 int in_size = x;
4977e04f3a18 Add support for parsing audio streams (though should be easy to extend to video)
reimar
parents: 29928
diff changeset
221 int consumed = ds_parse(sh_audio->ds, &start, &x, pts, 0);
4977e04f3a18 Add support for parsing audio streams (though should be easy to extend to video)
reimar
parents: 29928
diff changeset
222 sh_audio->ds->buffer_pos -= in_size - consumed;
4977e04f3a18 Add support for parsing audio streams (though should be easy to extend to video)
reimar
parents: 29928
diff changeset
223 }
32942
e3dfc7e2b0f8 Fix dnet decoding with -ac ffac3, the data needs to be byte-swapped.
reimar
parents: 32906
diff changeset
224 if (((AVCodecContext *)sh_audio->context)->codec_id == CODEC_ID_AC3 &&
e3dfc7e2b0f8 Fix dnet decoding with -ac ffac3, the data needs to be byte-swapped.
reimar
parents: 32906
diff changeset
225 sh_audio->format == MKTAG('d', 'n', 'e', 't'))
e3dfc7e2b0f8 Fix dnet decoding with -ac ffac3, the data needs to be byte-swapped.
reimar
parents: 32906
diff changeset
226 swab(start, start, x & ~1);
e3dfc7e2b0f8 Fix dnet decoding with -ac ffac3, the data needs to be byte-swapped.
reimar
parents: 32906
diff changeset
227
29913
9e76a5f9e717 Switch ad_ffmpeg to avcodec_decode_audio3
reimar
parents: 29912
diff changeset
228 av_init_packet(&pkt);
9e76a5f9e717 Switch ad_ffmpeg to avcodec_decode_audio3
reimar
parents: 29912
diff changeset
229 pkt.data = start;
9e76a5f9e717 Switch ad_ffmpeg to avcodec_decode_audio3
reimar
parents: 29912
diff changeset
230 pkt.size = x;
18242
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18150
diff changeset
231 if (pts != MP_NOPTS_VALUE) {
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18150
diff changeset
232 sh_audio->pts = pts;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18150
diff changeset
233 sh_audio->pts_bytes = 0;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18150
diff changeset
234 }
29913
9e76a5f9e717 Switch ad_ffmpeg to avcodec_decode_audio3
reimar
parents: 29912
diff changeset
235 y=avcodec_decode_audio3(sh_audio->context,(int16_t*)buf,&len2,&pkt);
11977
efb37725d616 flushing stuff after seeking (finally we can view MPEG without thouse blocks after seeking with -vc ffmpeg12)
michael
parents: 9547
diff changeset
236 //printf("return:%d samples_out:%d bitstream_in:%d sample_sum:%d\n", y, len2, x, len); fflush(stdout);
32496
5376d7337fcf Handle EAGAIN in ad_ffmpeg, this is necessary for LATM to work properly with
reimar
parents: 32390
diff changeset
237 // LATM may need many packets to find mux info
5376d7337fcf Handle EAGAIN in ad_ffmpeg, this is necessary for LATM to work properly with
reimar
parents: 32390
diff changeset
238 if (y == AVERROR(EAGAIN))
5376d7337fcf Handle EAGAIN in ad_ffmpeg, this is necessary for LATM to work properly with
reimar
parents: 32390
diff changeset
239 continue;
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
240 if(y<0){ mp_msg(MSGT_DECAUDIO,MSGL_V,"lavc_audio: error\n");break; }
30272
c6c40936049c We only need to disable seeking back in ad_ffmpeg when we actually _use_
reimar
parents: 30088
diff changeset
241 if(!sh_audio->parser && y<x)
30088
4977e04f3a18 Add support for parsing audio streams (though should be easy to extend to video)
reimar
parents: 29928
diff changeset
242 sh_audio->ds->buffer_pos+=y-x; // put back data (HACK!)
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
243 if(len2>0){
25315
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24226
diff changeset
244 if (((AVCodecContext *)sh_audio->context)->channels >= 5) {
32767
414aaa8b9357 Use av_get_bits_per_sample_fmt instead of deprecated
reimar
parents: 32496
diff changeset
245 int samplesize = av_get_bits_per_sample_fmt(((AVCodecContext *)
29491
99eda963d27a Fix incorrect channel ordering for lavc audio codecs (specifically ffac3,
tack
parents: 29263
diff changeset
246 sh_audio->context)->sample_fmt) / 8;
29779
282ea4fbe87d ad_ffmpeg: Fix channel layout for ffvorbis and ffaac
tack
parents: 29667
diff changeset
247 reorder_channel_nch(buf, AF_CHANNEL_LAYOUT_LAVC_DEFAULT,
25315
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24226
diff changeset
248 AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT,
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24226
diff changeset
249 ((AVCodecContext *)sh_audio->context)->channels,
29491
99eda963d27a Fix incorrect channel ordering for lavc audio codecs (specifically ffac3,
tack
parents: 29263
diff changeset
250 len2 / samplesize, samplesize);
25315
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24226
diff changeset
251 }
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
252 //len=len2;break;
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
253 if(len<0) len=len2; else len+=len2;
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
254 buf+=len2;
23456
1582297cc3d2 Use avcodec_decode_audio2 in ad_ffmpeg.c
reimar
parents: 21507
diff changeset
255 maxlen -= len2;
18242
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 18150
diff changeset
256 sh_audio->pts_bytes += len2;
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
257 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
258 mp_dbg(MSGT_DECAUDIO,MSGL_DBG2,"Decoded %d -> %d \n",y,len2);
31671
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
259
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
260 if (setup_format(sh_audio, sh_audio->context))
4541f1921482 Add support for parameter changes (e.g. channel count) during playback.
reimar
parents: 31220
diff changeset
261 break;
5340
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
262 }
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
263 return len;
0f12fb7c1c5d imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff changeset
264 }