Mercurial > mplayer.hg
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 |
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 | 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 | 93 int x; |
5480 | 94 AVCodecContext *lavc_context; |
95 AVCodec *lavc_codec; | |
5447 | 96 |
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 | 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 | 106 lavc_context = avcodec_alloc_context(); |
5480 | 107 sh_audio->context=lavc_context; |
7940 | 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 | 112 if(sh_audio->wf){ |
113 lavc_context->channels = sh_audio->wf->nChannels; | |
114 lavc_context->sample_rate = sh_audio->wf->nSamplesPerSec; | |
115 lavc_context->bit_rate = sh_audio->wf->nAvgBytesPerSec * 8; | |
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 | 118 } |
24108 | 119 lavc_context->request_channels = audio_output_channels; |
9547 | 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 | 122 lavc_context->codec_id = lavc_codec->id; // not sure if required, imho not --A'rpi |
7940 | 123 |
124 /* alloc extra data */ | |
8590 | 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 | 127 lavc_context->extradata_size = sh_audio->wf->cbSize; |
32105 | 128 memcpy(lavc_context->extradata, sh_audio->wf + 1, |
7940 | 129 lavc_context->extradata_size); |
130 } | |
131 | |
14633 | 132 // for QDM2 |
133 if (sh_audio->codecdata_len && sh_audio->codecdata && !lavc_context->extradata) | |
134 { | |
135 lavc_context->extradata = av_malloc(sh_audio->codecdata_len); | |
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 | 139 } |
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 | 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 | 148 // printf("\nFOURCC: 0x%X\n",sh_audio->format); |
149 if(sh_audio->format==0x3343414D){ | |
150 // MACE 3:1 | |
151 sh_audio->ds->ss_div = 2*3; // 1 samples/packet | |
8108 | 152 sh_audio->ds->ss_mul = 2*sh_audio->wf->nChannels; // 1 byte*ch/packet |
8101 | 153 } else |
154 if(sh_audio->format==0x3643414D){ | |
155 // MACE 6:1 | |
156 sh_audio->ds->ss_div = 2*6; // 1 samples/packet | |
8108 | 157 sh_audio->ds->ss_mul = 2*sh_audio->wf->nChannels; // 1 byte*ch/packet |
8101 | 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 | 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 | 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 | 184 AVCodecContext *lavc_context = sh->context; |
185 | |
186 if (avcodec_close(lavc_context) < 0) | |
5447 | 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 | 209 AVPacket pkt; |
23456 | 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 | 228 av_init_packet(&pkt); |
229 pkt.data = start; | |
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 | 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 | 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 } |