Mercurial > mplayer.hg
annotate libmpcodecs/ad_libdv.c @ 36441:b75ebb89d803
Workaround VDPAU decode errors on aspect change on NVidia.
The NVidia driver seems to expect a decoder reinit on aspect
change, otherwise giving a nonsense VDP_STATUS_INVALID_SIZE
error.
Since decode and display can run out of sync, we do not in fact
know when an aspect change will happen during decode but only when
we want to display that decoded frame, and with threaded decoding
these will differ significantly.
So just catch the error and retry decoding instead, this also has
the advantage of not affecting (and possibly costing performance)
drivers without this issue.
author | reimar |
---|---|
date | Sun, 08 Dec 2013 15:07:00 +0000 |
parents | b2829d4f2de4 |
children | 1b0d31ceb2ec |
rev | line source |
---|---|
30421
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
1 /* |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
2 * This file is part of MPlayer. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
3 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
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:
29263
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:
29263
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:
29263
diff
changeset
|
7 * (at your option) any later version. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
8 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
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:
29263
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:
29263
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:
29263
diff
changeset
|
12 * GNU General Public License for more details. |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
13 * |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
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:
29263
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:
29263
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:
29263
diff
changeset
|
17 */ |
bbb6ebec87a0
Add missing license headers to all files in the libmpcodecs directory.
diego
parents:
29263
diff
changeset
|
18 |
6927 | 19 #include <stdio.h> |
20 #include <stdlib.h> | |
21 #include <string.h> | |
22 #include <sys/types.h> | |
23 #include <unistd.h> | |
24 #include <math.h> | |
25 | |
26 #include "config.h" | |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
7180
diff
changeset
|
27 #include "mp_msg.h" |
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
7180
diff
changeset
|
28 #include "help_mp.h" |
6927 | 29 |
30 #include "img_format.h" | |
31 | |
32 #include <libdv/dv.h> | |
33 #include <libdv/dv_types.h> | |
34 | |
22599
4faee1254928
Add explicit location for headers from the stream/ directory.
diego
parents:
18771
diff
changeset
|
35 #include "stream/stream.h" |
22601
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22599
diff
changeset
|
36 #include "libmpdemux/demuxer.h" |
ed8f90096c65
Add explicit location for headers from the libmpdemux/ directory.
diego
parents:
22599
diff
changeset
|
37 #include "libmpdemux/stheader.h" |
6927 | 38 |
39 #include "ad_internal.h" | |
30553
b2829d4f2de4
Add header for init_global_rawdv_decoder() instead of forward declaring it.
diego
parents:
30504
diff
changeset
|
40 #include "vd_libdv.h" |
6927 | 41 |
30504
cc27da5d7286
Mark all ad_info_t/vd_info_t structure declarations as const.
diego
parents:
30421
diff
changeset
|
42 static const ad_info_t info = |
6927 | 43 { |
44 "Raw DV Audio Decoder", | |
45 "libdv", | |
46 "Alexander Neundorf <neundorf@kde.org>", | |
47 "http://libdv.sf.net", | |
48 "" | |
49 }; | |
50 | |
51 LIBAD_EXTERN(libdv) | |
52 | |
53 static int preinit(sh_audio_t *sh_audio) | |
54 { | |
55 sh_audio->audio_out_minsize=4*DV_AUDIO_MAX_SAMPLES*2; | |
56 return 1; | |
57 } | |
58 | |
59 static int16_t *audioBuffers[4]={NULL,NULL,NULL,NULL}; | |
60 | |
61 static int init(sh_audio_t *sh) | |
62 { | |
63 int i; | |
64 WAVEFORMATEX *h=sh->wf; | |
65 | |
66 if(!h) return 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22886
diff
changeset
|
67 |
6927 | 68 sh->i_bps=h->nAvgBytesPerSec; |
69 sh->channels=h->nChannels; | |
70 sh->samplerate=h->nSamplesPerSec; | |
71 sh->samplesize=(h->wBitsPerSample+7)/8; | |
72 | |
73 sh->context=init_global_rawdv_decoder(); | |
74 | |
75 for (i=0; i < 4; i++) | |
76 audioBuffers[i] = malloc(2*DV_AUDIO_MAX_SAMPLES); | |
77 | |
78 return 1; | |
79 } | |
80 | |
81 static void uninit(sh_audio_t *sh_audio) | |
82 { | |
83 int i; | |
84 for (i=0; i < 4; i++) | |
85 free(audioBuffers[i]); | |
86 } | |
87 | |
88 static int control(sh_audio_t *sh,int cmd,void* arg, ...) | |
89 { | |
90 // TODO!!! | |
91 return CONTROL_UNKNOWN; | |
92 } | |
93 | |
94 static int decode_audio(sh_audio_t *audio, unsigned char *buf, int minlen, int maxlen) | |
95 { | |
96 int len=0; | |
97 dv_decoder_t* decoder=audio->context; //global_rawdv_decoder; | |
98 unsigned char* dv_audio_frame=NULL; | |
99 int xx=ds_get_packet(audio->ds,&dv_audio_frame); | |
100 if(xx<=0 || !dv_audio_frame) return 0; // EOF? | |
101 | |
102 dv_parse_header(decoder, dv_audio_frame); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22886
diff
changeset
|
103 |
6927 | 104 if(xx!=decoder->frame_size) |
18004
bcd805923554
Part2 of several printf2mp_msg changes in patch from Otvos Attila oattila AT chello DOT hu with LOTS of modifications by me
reynaldo
parents:
7180
diff
changeset
|
105 mp_msg(MSGT_GLOBAL,MSGL_WARN,MSGTR_MPCODECS_AudioFramesizeDiffers, |
6927 | 106 xx, decoder->frame_size); |
107 | |
108 if (dv_decode_full_audio(decoder, dv_audio_frame,(int16_t**) audioBuffers)) | |
109 { | |
110 /* Interleave the audio into a single buffer */ | |
111 int i=0; | |
112 int16_t *bufP=(int16_t*)buf; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
22886
diff
changeset
|
113 |
6927 | 114 // printf("samples=%d/%d chans=%d mem=%d \n",decoder->audio->samples_this_frame,DV_AUDIO_MAX_SAMPLES, |
115 // decoder->audio->num_channels, decoder->audio->samples_this_frame*decoder->audio->num_channels*2); | |
116 | |
117 // return (44100/30)*4; | |
118 | |
119 for (i=0; i < decoder->audio->samples_this_frame; i++) | |
120 { | |
121 int ch; | |
122 for (ch=0; ch < decoder->audio->num_channels; ch++) | |
123 bufP[len++] = audioBuffers[ch][i]; | |
124 } | |
125 } | |
126 return len*2; | |
127 } |