annotate libmpcodecs/ad_hwmpa.c @ 30795:1001c606f94c

Make emulated Win32 critical sections thread safe. Earlier, cs->locked was accessed outside the mutex to get around the problem that default pthread mutexes are not recursive (ie., you cannot do a double-lock from the same thread), causing a thread-safety problem, as both detected by Helgrind and showing up in some multithreaded codecs. The ideal solution here would be to simply use recursive pthread mutexes, but there were concerns about reduced debuggability and possibly portability. Thus, instead, rewrite the critical sections to be a simple lock count (with owner) protected by a regular mutex. Whenever a thread wants to enter the critical section and lock_count is not 0, it sleeps on a special event that tells it when the critical section is available.
author sesse
date Thu, 04 Mar 2010 15:57:08 +0000
parents d3bdd149294e
children
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: 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
17397
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
19 #include <stdio.h>
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
20 #include <stdlib.h>
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
21 #include <string.h>
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
22 #include <unistd.h>
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
23
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
24 #include "config.h"
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
25
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
26 #include "mp_msg.h"
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
27 #include "help_mp.h"
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
28
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
29 #include "libaf/af_format.h"
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
30 #include "ad_internal.h"
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
31
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
32 #include "libmpdemux/mp3_hdr.h"
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
33
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
34 //based on ad_hwac3.c and ad_libmad.c
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
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 =
17397
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
37 {
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
38 "MPEG audio pass-through (fake decoder)",
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
39 "hwmpa",
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
40 "NicoDVB",
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
41 "NicoDVB",
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
42 "For hardware decoders"
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
43 };
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
44
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
45 LIBAD_EXTERN(hwmpa)
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
46
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
47 static int mpa_sync(sh_audio_t *sh, int no_frames, int *n, int *chans, int *srate, int *spf, int *mpa_layer, int *br)
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
48 {
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
49 int cnt = 0, x = 0, len, frames_count;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
50
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
51 frames_count = 0;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
52 do
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
53 {
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
54 while(cnt + 4 < sh->a_in_buffer_len)
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
55 {
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
56 x = mp_get_mp3_header(&(sh->a_in_buffer[cnt]), chans, srate, spf, mpa_layer, br);
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
57 if(x > 0)
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
58 {
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
59 frames_count++;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
60 if(frames_count == no_frames)
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
61 {
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
62 *n = x;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
63 return cnt;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
64 }
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
65 }
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
66 cnt++;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
67 }
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
68 len = demux_read_data(sh->ds,&sh->a_in_buffer[sh->a_in_buffer_len],sh->a_in_buffer_size-sh->a_in_buffer_len);
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
69 if(len > 0)
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
70 sh->a_in_buffer_len += len;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
71 } while(len > 0);
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
72 mp_msg(MSGT_DECAUDIO,MSGL_INFO,"Cannot sync MPA frame: %d\r\n", len);
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
73 return -1;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
74 }
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
75
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
76 static int preinit(sh_audio_t *sh)
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
77 {
19157
597866a6793d the value returned by decode_audio() must be the amount of _decoded_ bytes (finally it's beginning t work: no more toomanypackets... message)
nicodvb
parents: 19120
diff changeset
78 sh->audio_out_minsize = 4608;//check
17397
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
79 sh->audio_in_minsize = 4608;//check
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
80 sh->sample_format = AF_FORMAT_MPEG2;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
81 return 1;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
82 }
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
83
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
84 static int init(sh_audio_t *sh)
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
85 {
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
86 int cnt, chans, srate, spf, mpa_layer, br, len;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
87
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
88 if((cnt = mpa_sync(sh, 1, &len, &chans, &srate, &spf, &mpa_layer, &br)) < 0)
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
89 return 0;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
90
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
91 sh->channels = chans;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
92 sh->samplerate = srate;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
93 sh->i_bps = br * 125;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
94 sh->samplesize = 2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 21531
diff changeset
95
17397
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
96 mp_msg(MSGT_DECAUDIO,MSGL_V,"AC_HWMPA initialized, bitrate: %d kb/s\r\n", len);
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
97 return 1;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
98 }
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
99
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
100 static int decode_audio(sh_audio_t *sh,unsigned char *buf,int minlen,int maxlen)
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
101 {
19120
017a563d8d93 prevent buffer underflow; the code is still incorrect and leads to desync but at least it doesn't crash
nicodvb
parents: 18958
diff changeset
102 int len, start, tot;
17397
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
103 int chans, srate, spf, mpa_layer, br;
19157
597866a6793d the value returned by decode_audio() must be the amount of _decoded_ bytes (finally it's beginning t work: no more toomanypackets... message)
nicodvb
parents: 19120
diff changeset
104 int tot2;
17397
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
105
19157
597866a6793d the value returned by decode_audio() must be the amount of _decoded_ bytes (finally it's beginning t work: no more toomanypackets... message)
nicodvb
parents: 19120
diff changeset
106 tot = tot2 = 0;
19120
017a563d8d93 prevent buffer underflow; the code is still incorrect and leads to desync but at least it doesn't crash
nicodvb
parents: 18958
diff changeset
107
19157
597866a6793d the value returned by decode_audio() must be the amount of _decoded_ bytes (finally it's beginning t work: no more toomanypackets... message)
nicodvb
parents: 19120
diff changeset
108 while(tot2 < maxlen)
17397
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
109 {
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
110 start = mpa_sync(sh, 1, &len, &chans, &srate, &spf, &mpa_layer, &br);
19157
597866a6793d the value returned by decode_audio() must be the amount of _decoded_ bytes (finally it's beginning t work: no more toomanypackets... message)
nicodvb
parents: 19120
diff changeset
111 if(start < 0 || tot2 + spf * 2 * chans > maxlen)
17397
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
112 break;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
113
19120
017a563d8d93 prevent buffer underflow; the code is still incorrect and leads to desync but at least it doesn't crash
nicodvb
parents: 18958
diff changeset
114 if(start + len > sh->a_in_buffer_len)
017a563d8d93 prevent buffer underflow; the code is still incorrect and leads to desync but at least it doesn't crash
nicodvb
parents: 18958
diff changeset
115 {
017a563d8d93 prevent buffer underflow; the code is still incorrect and leads to desync but at least it doesn't crash
nicodvb
parents: 18958
diff changeset
116 int l;
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 19286
diff changeset
117 l = FFMIN(sh->a_in_buffer_size - sh->a_in_buffer_len, start + len);
19120
017a563d8d93 prevent buffer underflow; the code is still incorrect and leads to desync but at least it doesn't crash
nicodvb
parents: 18958
diff changeset
118 l = demux_read_data(sh->ds,&sh->a_in_buffer[sh->a_in_buffer_len], l);
017a563d8d93 prevent buffer underflow; the code is still incorrect and leads to desync but at least it doesn't crash
nicodvb
parents: 18958
diff changeset
119 if(! l)
19159
7945609397b0 in decode_audio() memset(0) unused memory in buf before returning
nicodvb
parents: 19158
diff changeset
120 break;
19120
017a563d8d93 prevent buffer underflow; the code is still incorrect and leads to desync but at least it doesn't crash
nicodvb
parents: 18958
diff changeset
121 sh->a_in_buffer_len += l;
017a563d8d93 prevent buffer underflow; the code is still incorrect and leads to desync but at least it doesn't crash
nicodvb
parents: 18958
diff changeset
122 continue;
017a563d8d93 prevent buffer underflow; the code is still incorrect and leads to desync but at least it doesn't crash
nicodvb
parents: 18958
diff changeset
123 }
017a563d8d93 prevent buffer underflow; the code is still incorrect and leads to desync but at least it doesn't crash
nicodvb
parents: 18958
diff changeset
124
017a563d8d93 prevent buffer underflow; the code is still incorrect and leads to desync but at least it doesn't crash
nicodvb
parents: 18958
diff changeset
125 memcpy(&buf[tot], &(sh->a_in_buffer[start]), len);
017a563d8d93 prevent buffer underflow; the code is still incorrect and leads to desync but at least it doesn't crash
nicodvb
parents: 18958
diff changeset
126 tot += len;
017a563d8d93 prevent buffer underflow; the code is still incorrect and leads to desync but at least it doesn't crash
nicodvb
parents: 18958
diff changeset
127
17397
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
128 sh->a_in_buffer_len -= start + len;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
129 memmove(sh->a_in_buffer, &(sh->a_in_buffer[start + len]), sh->a_in_buffer_len);
19157
597866a6793d the value returned by decode_audio() must be the amount of _decoded_ bytes (finally it's beginning t work: no more toomanypackets... message)
nicodvb
parents: 19120
diff changeset
130 tot2 += spf * 2 * chans;
19286
ac6746d40459 fix a/v sync issues when using ad_hwmpa
ben
parents: 19159
diff changeset
131
ac6746d40459 fix a/v sync issues when using ad_hwmpa
ben
parents: 19159
diff changeset
132 /* HACK: seems to fix most A/V sync issues */
ac6746d40459 fix a/v sync issues when using ad_hwmpa
ben
parents: 19159
diff changeset
133 break;
17397
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
134 }
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
135
19159
7945609397b0 in decode_audio() memset(0) unused memory in buf before returning
nicodvb
parents: 19158
diff changeset
136 memset(&buf[tot], 0, tot2-tot);
19157
597866a6793d the value returned by decode_audio() must be the amount of _decoded_ bytes (finally it's beginning t work: no more toomanypackets... message)
nicodvb
parents: 19120
diff changeset
137 return tot2;
17397
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
138 }
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
139
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
140
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
141 static int control(sh_audio_t *sh,int cmd,void* arg, ...)
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
142 {
18958
a8e681ad7c90 Remove unused variables, patch by Stefan Huehner stefan at huehner org.
diego
parents: 17397
diff changeset
143 int start, len;
17397
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
144
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
145 switch(cmd)
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
146 {
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
147 case ADCTRL_RESYNC_STREAM:
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
148 if(mpa_sync(sh, 1, &len, NULL, NULL, NULL, NULL, NULL) >= 0)
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
149 return CONTROL_TRUE;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
150 else
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
151 return CONTROL_FALSE;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
152 case ADCTRL_SKIP_FRAME:
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
153 start = mpa_sync(sh, 2, &len, NULL, NULL, NULL, NULL, NULL);
30690
d3bdd149294e Fix check for wrong variable: len can be unitialized but not normally < 0,
reimar
parents: 30504
diff changeset
154 if(start < 0)
17397
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
155 return CONTROL_FALSE;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
156
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
157 sh->a_in_buffer_len -= start;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
158 memmove(sh->a_in_buffer, &(sh->a_in_buffer[start]), sh->a_in_buffer_len);
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
159 return CONTROL_TRUE;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
160 }
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
161 return CONTROL_UNKNOWN;
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
162 }
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
163
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
164
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
165 static void uninit(sh_audio_t *sh)
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
166 {
2e20dd653147 ad_hwmpa: pass-through fake audio codec for hardware mpeg decoders
nicodvb
parents:
diff changeset
167 }