Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
369ccbef
Commit
369ccbef
authored
Sep 18, 2005
by
Gildas Bazin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* modules/codec/realaudio.c: real audio (cook) decoder using real's libraries.
parent
7b9cc3cf
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
711 additions
and
0 deletions
+711
-0
configure.ac
configure.ac
+11
-0
modules/codec/Modules.am
modules/codec/Modules.am
+1
-0
modules/codec/realaudio.c
modules/codec/realaudio.c
+699
-0
No files found.
configure.ac
View file @
369ccbef
...
...
@@ -2393,6 +2393,15 @@ then
fi
fi
dnl
dnl Real plugin
dnl
AC_ARG_ENABLE(real,
[ --enable-real Real audio module (default disabled)])
if test "${enable_real}" = "yes"; then
VLC_ADD_PLUGINS([realaudio])
fi
dnl
dnl MP4 module
dnl
...
...
@@ -4308,6 +4317,8 @@ AS_IF([test "${enable_loader}" = "yes"],
VLC_ADD_LDFLAGS([dmo],[../../../loader/libloader.a])
VLC_ADD_CPPFLAGS([quicktime],[-I../../@top_srcdir@/loader])
VLC_ADD_LDFLAGS([quicktime],[../../loader/libloader.a])
VLC_ADD_CPPFLAGS([realaudio],[-I../../@top_srcdir@/loader])
VLC_ADD_LDFLAGS([realaudio],[../../loader/libloader.a])
])
dnl
...
...
modules/codec/Modules.am
View file @
369ccbef
...
...
@@ -26,4 +26,5 @@ SOURCES_png = png.c
SOURCES_svcdsub = svcdsub.c
SOURCES_cvdsub = cvdsub.c
SOURCES_fake = fake.c
SOURCES_realaudio = realaudio.c
SOURCES_sdl_image = sdl_image.c
modules/codec/realaudio.c
0 → 100644
View file @
369ccbef
/*****************************************************************************
* realaudio.c: a realaudio decoder that uses the realaudio library/dll
*****************************************************************************
* Copyright (C) 2005 the VideoLAN team
* $Id: quicktime.c 11664 2005-07-09 06:17:09Z courmisch $
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
*****************************************************************************/
/*****************************************************************************
* Preamble
*****************************************************************************/
#include <vlc/vlc.h>
#include <vlc/aout.h>
#include <vlc/vout.h>
#include <vlc/decoder.h>
#ifdef LOADER
/* Need the w32dll loader from mplayer */
# include <wine/winerror.h>
# include <ldt_keeper.h>
# include <wine/windef.h>
void
*
WINAPI
LoadLibraryA
(
char
*
name
);
void
*
WINAPI
GetProcAddress
(
void
*
handle
,
char
*
func
);
int
WINAPI
FreeLibrary
(
void
*
handle
);
#endif
#ifndef WINAPI
# define WINAPI
#endif
#if defined(HAVE_DL_DLOPEN)
# if defined(HAVE_DLFCN_H)
/* Linux, BSD, Hurd */
# include <dlfcn.h>
# endif
# if defined(HAVE_SYS_DL_H)
# include <sys/dl.h>
# endif
#endif
/*****************************************************************************
* Module descriptor
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
);
static
void
Close
(
vlc_object_t
*
);
vlc_module_begin
();
set_description
(
_
(
"RealAudio library decoder"
)
);
set_capability
(
"decoder"
,
10
);
set_category
(
CAT_INPUT
);
set_subcategory
(
SUBCAT_INPUT_VCODEC
);
set_callbacks
(
Open
,
Close
);
vlc_module_end
();
/*****************************************************************************
* Local prototypes
*****************************************************************************/
static
int
OpenDll
(
decoder_t
*
);
static
int
OpenNativeDll
(
decoder_t
*
,
char
*
,
char
*
);
static
int
OpenWin32Dll
(
decoder_t
*
,
char
*
,
char
*
);
static
void
CloseDll
(
decoder_t
*
);
static
aout_buffer_t
*
Decode
(
decoder_t
*
,
block_t
**
);
struct
decoder_sys_t
{
audio_date_t
end_date
;
/* Frame buffer for data reordering */
int
i_subpacket
;
int
i_frame_size
;
char
*
p_frame
;
int
i_frame
;
/* Output buffer */
char
*
p_out
;
/* Codec params */
void
*
context
;
int
i_subpacket_size
;
int
i_subpacket_h
;
int
i_codec_flavor
;
int
i_coded_frame_size
;
int
i_extra
;
uint8_t
*
p_extra
;
void
*
dll
;
unsigned
long
(
*
raCloseCodec
)(
void
*
);
unsigned
long
(
*
raDecode
)(
void
*
,
char
*
,
unsigned
long
,
char
*
,
unsigned
int
*
,
long
);
unsigned
long
(
*
raFlush
)(
unsigned
long
,
unsigned
long
,
unsigned
long
);
unsigned
long
(
*
raFreeDecoder
)(
void
*
);
void
*
(
*
raGetFlavorProperty
)(
void
*
,
unsigned
long
,
unsigned
long
,
int
*
);
unsigned
long
(
*
raInitDecoder
)(
void
*
,
void
*
);
unsigned
long
(
*
raOpenCodec
)(
void
*
);
unsigned
long
(
*
raOpenCodec2
)(
void
*
,
void
*
);
unsigned
long
(
*
raSetFlavor
)(
void
*
,
unsigned
long
);
void
(
*
raSetDLLAccessPath
)(
char
*
);
void
(
*
raSetPwd
)(
char
*
,
char
*
);
#if defined(LOADER)
ldt_fs_t
*
ldt_fs
;
#endif
void
*
win32_dll
;
unsigned
long
WINAPI
(
*
wraCloseCodec
)(
void
*
);
unsigned
long
WINAPI
(
*
wraDecode
)(
void
*
,
char
*
,
unsigned
long
,
char
*
,
unsigned
int
*
,
long
);
unsigned
long
WINAPI
(
*
wraFlush
)(
unsigned
long
,
unsigned
long
,
unsigned
long
);
unsigned
long
WINAPI
(
*
wraFreeDecoder
)(
void
*
);
void
*
WINAPI
(
*
wraGetFlavorProperty
)(
void
*
,
unsigned
long
,
unsigned
long
,
int
*
);
unsigned
long
WINAPI
(
*
wraInitDecoder
)(
void
*
,
void
*
);
unsigned
long
WINAPI
(
*
wraOpenCodec
)(
void
*
);
unsigned
long
WINAPI
(
*
wraOpenCodec2
)(
void
*
,
void
*
);
unsigned
long
WINAPI
(
*
wraSetFlavor
)(
void
*
,
unsigned
long
);
void
WINAPI
(
*
wraSetDLLAccessPath
)(
char
*
);
void
WINAPI
(
*
wraSetPwd
)(
char
*
,
char
*
);
};
/* linux dlls doesn't need packing */
typedef
struct
/*__attribute__((__packed__))*/
{
int
samplerate
;
short
bits
;
short
channels
;
short
quality
;
/* 2bytes padding here, by gcc */
int
bits_per_frame
;
int
packetsize
;
int
extradata_len
;
void
*
extradata
;
}
ra_init_t
;
/* windows dlls need packed structs (no padding) */
typedef
struct
__attribute__
((
__packed__
))
{
int
samplerate
;
short
bits
;
short
channels
;
short
quality
;
int
bits_per_frame
;
int
packetsize
;
int
extradata_len
;
void
*
extradata
;
}
wra_init_t
;
void
*
__builtin_new
(
unsigned
long
size
)
{
return
malloc
(
size
);}
void
__builtin_delete
(
void
*
p
)
{
free
(
p
);}
static
int
pi_channels_maps
[
7
]
=
{
0
,
AOUT_CHAN_CENTER
,
AOUT_CHAN_LEFT
|
AOUT_CHAN_RIGHT
,
AOUT_CHAN_CENTER
|
AOUT_CHAN_LEFT
|
AOUT_CHAN_RIGHT
,
AOUT_CHAN_LEFT
|
AOUT_CHAN_RIGHT
|
AOUT_CHAN_REARLEFT
|
AOUT_CHAN_REARRIGHT
,
AOUT_CHAN_LEFT
|
AOUT_CHAN_RIGHT
|
AOUT_CHAN_CENTER
|
AOUT_CHAN_REARLEFT
|
AOUT_CHAN_REARRIGHT
,
AOUT_CHAN_LEFT
|
AOUT_CHAN_RIGHT
|
AOUT_CHAN_CENTER
|
AOUT_CHAN_REARLEFT
|
AOUT_CHAN_REARRIGHT
|
AOUT_CHAN_LFE
};
/*****************************************************************************
* Open: probe the decoder and return score
*****************************************************************************
* Tries to launch a decoder and return score so that the interface is able
* to choose.
*****************************************************************************/
static
int
Open
(
vlc_object_t
*
p_this
)
{
decoder_t
*
p_dec
=
(
decoder_t
*
)
p_this
;
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
switch
(
p_dec
->
fmt_in
.
i_codec
)
{
case
VLC_FOURCC
(
'c'
,
'o'
,
'o'
,
'k'
):
break
;
default:
return
VLC_EGENERIC
;
}
p_dec
->
p_sys
=
p_sys
=
malloc
(
sizeof
(
decoder_sys_t
)
);
memset
(
p_sys
,
0
,
sizeof
(
decoder_sys_t
)
);
if
(
p_dec
->
fmt_in
.
i_extra
>=
10
)
{
p_sys
->
i_subpacket_size
=
((
short
*
)(
p_dec
->
fmt_in
.
p_extra
))[
0
];
p_sys
->
i_subpacket_h
=
((
short
*
)(
p_dec
->
fmt_in
.
p_extra
))[
1
];
p_sys
->
i_codec_flavor
=
((
short
*
)(
p_dec
->
fmt_in
.
p_extra
))[
2
];
p_sys
->
i_coded_frame_size
=
((
short
*
)(
p_dec
->
fmt_in
.
p_extra
))[
3
];
p_sys
->
i_extra
=
((
short
*
)(
p_dec
->
fmt_in
.
p_extra
))[
4
];
p_sys
->
p_extra
=
p_dec
->
fmt_in
.
p_extra
+
10
;
}
if
(
OpenDll
(
p_dec
)
!=
VLC_SUCCESS
)
{
free
(
p_sys
);
return
VLC_EGENERIC
;
}
#ifdef LOADER
if
(
p_sys
->
win32_dll
)
Close
(
p_this
);
#endif
es_format_Init
(
&
p_dec
->
fmt_out
,
AUDIO_ES
,
AOUT_FMT_S16_NE
);
p_dec
->
fmt_out
.
audio
.
i_rate
=
p_dec
->
fmt_in
.
audio
.
i_rate
;
p_dec
->
fmt_out
.
audio
.
i_channels
=
p_dec
->
fmt_in
.
audio
.
i_channels
;
p_dec
->
fmt_out
.
audio
.
i_bitspersample
=
p_dec
->
fmt_in
.
audio
.
i_bitspersample
;
p_dec
->
fmt_out
.
audio
.
i_physical_channels
=
p_dec
->
fmt_out
.
audio
.
i_original_channels
=
pi_channels_maps
[
p_dec
->
fmt_out
.
audio
.
i_channels
];
aout_DateInit
(
&
p_sys
->
end_date
,
p_dec
->
fmt_out
.
audio
.
i_rate
);
aout_DateSet
(
&
p_sys
->
end_date
,
0
);
p_dec
->
pf_decode_audio
=
Decode
;
p_sys
->
i_frame_size
=
p_dec
->
fmt_in
.
audio
.
i_blockalign
*
p_sys
->
i_subpacket_h
;
p_sys
->
p_frame
=
malloc
(
p_sys
->
i_frame_size
);
p_sys
->
i_subpacket
=
0
;
p_sys
->
i_frame
=
0
;
p_sys
->
p_out
=
malloc
(
4096
*
10
);
return
VLC_SUCCESS
;
}
/*****************************************************************************
* Close:
*****************************************************************************/
static
void
Close
(
vlc_object_t
*
p_this
)
{
decoder_t
*
p_dec
=
(
decoder_t
*
)
p_this
;
CloseDll
(
p_dec
);
if
(
p_dec
->
p_sys
->
p_frame
)
free
(
p_dec
->
p_sys
->
p_frame
);
if
(
p_dec
->
p_sys
->
p_out
)
free
(
p_dec
->
p_sys
->
p_out
);
free
(
p_dec
->
p_sys
);
}
/*****************************************************************************
* OpenDll:
*****************************************************************************/
static
int
OpenDll
(
decoder_t
*
p_dec
)
{
char
*
psz_codec
,
*
psz_dll
;
int
i
,
i_result
;
char
*
ppsz_path
[]
=
{
"."
,
"z:
\\
home
\\
videolan
\\
vlc"
,
"/home/videolan/vlc"
,
#ifndef WIN32
"/usr/local/RealPlayer8/Codecs"
,
"/usr/RealPlayer8/Codecs"
,
"/usr/lib/RealPlayer8/Codecs"
,
"/opt/RealPlayer8/Codecs"
,
"/usr/lib/RealPlayer9/users/Real/Codecs"
,
"/usr/lib64/RealPlayer8/Codecs"
,
"/usr/lib64/RealPlayer9/users/Real/Codecs"
,
"/usr/lib/win32"
,
#endif
NULL
};
switch
(
p_dec
->
fmt_in
.
i_codec
)
{
case
VLC_FOURCC
(
'c'
,
'o'
,
'o'
,
'k'
):
psz_codec
=
"cook.so.6.0"
;
break
;
case
VLC_FOURCC
(
'2'
,
'8'
,
'_'
,
'8'
):
psz_codec
=
"28_8.so.6.0"
;
break
;
case
VLC_FOURCC
(
'1'
,
'4'
,
'_'
,
'4'
):
psz_codec
=
"14_4.so.6.0"
;
break
;
default:
return
VLC_EGENERIC
;
}
for
(
i
=
0
;
ppsz_path
[
i
];
i
++
)
{
asprintf
(
&
psz_dll
,
"%s/%s"
,
ppsz_path
[
i
],
psz_codec
);
i_result
=
OpenNativeDll
(
p_dec
,
ppsz_path
[
i
],
psz_dll
);
free
(
psz_dll
);
if
(
i_result
==
VLC_SUCCESS
)
return
VLC_SUCCESS
;
}
switch
(
p_dec
->
fmt_in
.
i_codec
)
{
case
VLC_FOURCC
(
'c'
,
'o'
,
'o'
,
'k'
):
psz_codec
=
"cook3260.dll"
;
break
;
case
VLC_FOURCC
(
'2'
,
'8'
,
'_'
,
'8'
):
psz_codec
=
"28_83260.dll"
;
break
;
case
VLC_FOURCC
(
'1'
,
'4'
,
'_'
,
'4'
):
psz_codec
=
"14_43260.dll"
;
break
;
default:
return
VLC_EGENERIC
;
}
for
(
i
=
0
;
ppsz_path
[
i
];
i
++
)
{
asprintf
(
&
psz_dll
,
"%s
\\
%s"
,
ppsz_path
[
i
],
psz_codec
);
i_result
=
OpenWin32Dll
(
p_dec
,
ppsz_path
[
i
],
psz_dll
);
free
(
psz_dll
);
if
(
i_result
==
VLC_SUCCESS
)
return
VLC_SUCCESS
;
}
return
VLC_EGENERIC
;
}
static
int
OpenNativeDll
(
decoder_t
*
p_dec
,
char
*
psz_path
,
char
*
psz_dll
)
{
#if defined(HAVE_DL_DLOPEN)
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
void
*
handle
=
0
,
*
context
=
0
;
unsigned
int
i_result
;
void
*
p_prop
;
int
i_prop
;
ra_init_t
init_data
=
{
p_dec
->
fmt_in
.
audio
.
i_rate
,
p_dec
->
fmt_in
.
audio
.
i_bitspersample
,
p_dec
->
fmt_in
.
audio
.
i_channels
,
100
,
/* quality */
p_sys
->
i_subpacket_size
,
p_sys
->
i_coded_frame_size
,
p_sys
->
i_extra
,
p_sys
->
p_extra
};
msg_Dbg
(
p_dec
,
"opening library '%s'"
,
psz_dll
);
if
(
!
(
handle
=
dlopen
(
psz_dll
,
RTLD_LAZY
))
)
{
msg_Dbg
(
p_dec
,
"couldn't load library '%s' (%s)"
,
psz_dll
,
dlerror
()
);
return
VLC_EGENERIC
;
}
p_sys
->
raCloseCodec
=
dlsym
(
handle
,
"RACloseCodec"
);
p_sys
->
raDecode
=
dlsym
(
handle
,
"RADecode"
);
p_sys
->
raFlush
=
dlsym
(
handle
,
"RAFlush"
);
p_sys
->
raFreeDecoder
=
dlsym
(
handle
,
"RAFreeDecoder"
);
p_sys
->
raGetFlavorProperty
=
dlsym
(
handle
,
"RAGetFlavorProperty"
);
p_sys
->
raOpenCodec
=
dlsym
(
handle
,
"RAOpenCodec"
);
p_sys
->
raOpenCodec2
=
dlsym
(
handle
,
"RAOpenCodec2"
);
p_sys
->
raInitDecoder
=
dlsym
(
handle
,
"RAInitDecoder"
);
p_sys
->
raSetFlavor
=
dlsym
(
handle
,
"RASetFlavor"
);
p_sys
->
raSetDLLAccessPath
=
dlsym
(
handle
,
"SetDLLAccessPath"
);
p_sys
->
raSetPwd
=
dlsym
(
handle
,
"RASetPwd"
);
// optional, used by SIPR
if
(
!
(
p_sys
->
raOpenCodec
||
p_sys
->
raOpenCodec2
)
||
!
p_sys
->
raCloseCodec
||
!
p_sys
->
raInitDecoder
||
!
p_sys
->
raDecode
||
!
p_sys
->
raFreeDecoder
||
!
p_sys
->
raGetFlavorProperty
||
!
p_sys
->
raSetFlavor
/* || !p_sys->raFlush || !p_sys->raSetDLLAccessPath */
)
{
goto
error_native
;
}
if
(
p_sys
->
raOpenCodec2
)
i_result
=
p_sys
->
raOpenCodec2
(
&
context
,
psz_path
);
else
i_result
=
p_sys
->
raOpenCodec
(
&
context
);
if
(
i_result
)
{
msg_Err
(
p_dec
,
"decoder open failed, error code: 0x%x"
,
i_result
);
goto
error_native
;
}
i_result
=
p_sys
->
raInitDecoder
(
context
,
&
init_data
);
if
(
i_result
)
{
msg_Err
(
p_dec
,
"decoder init failed, error code: 0x%x"
,
i_result
);
goto
error_native
;
}
i_result
=
p_sys
->
raSetFlavor
(
context
,
p_sys
->
i_codec_flavor
);
if
(
i_result
)
{
msg_Err
(
p_dec
,
"decoder flavor setup failed, error code: 0x%x"
,
i_result
);
goto
error_native
;
}
p_prop
=
p_sys
->
raGetFlavorProperty
(
context
,
p_sys
->
i_codec_flavor
,
0
,
&
i_prop
);
msg_Dbg
(
p_dec
,
"audio codec: [%d] %s"
,
p_sys
->
i_codec_flavor
,
(
char
*
)
p_prop
);
p_prop
=
p_sys
->
raGetFlavorProperty
(
context
,
p_sys
->
i_codec_flavor
,
1
,
&
i_prop
);
if
(
p_prop
)
{
int
i_bps
=
((
*
((
int
*
)
p_prop
))
+
4
)
/
8
;
msg_Dbg
(
p_dec
,
"audio bitrate: %5.3f kbit/s (%d bps)"
,
(
*
((
int
*
)
p_prop
))
*
0
.
001
f
,
i_bps
);
}
p_sys
->
context
=
context
;
p_sys
->
dll
=
handle
;
return
VLC_SUCCESS
;
error_native:
if
(
context
)
p_sys
->
raFreeDecoder
(
context
);
if
(
context
)
p_sys
->
raCloseCodec
(
context
);
dlclose
(
handle
);
#endif
return
VLC_EGENERIC
;
}
static
int
OpenWin32Dll
(
decoder_t
*
p_dec
,
char
*
psz_path
,
char
*
psz_dll
)
{
#if defined(LOADER) || defined(WIN32)
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
void
*
handle
=
0
,
*
context
=
0
;
unsigned
int
i_result
;
void
*
p_prop
;
int
i_prop
;
wra_init_t
init_data
=
{
p_dec
->
fmt_in
.
audio
.
i_rate
,
p_dec
->
fmt_in
.
audio
.
i_bitspersample
,
p_dec
->
fmt_in
.
audio
.
i_channels
,
100
,
/* quality */
p_sys
->
i_subpacket_size
,
p_sys
->
i_coded_frame_size
,
p_sys
->
i_extra
,
p_sys
->
p_extra
};
msg_Err
(
p_dec
,
"opening win32 dll '%s'"
,
psz_dll
);
#ifdef LOADER
Setup_LDT_Keeper
();
#endif
if
(
!
(
handle
=
LoadLibraryA
(
psz_dll
))
)
{
msg_Dbg
(
p_dec
,
"couldn't load dll '%s'"
,
psz_dll
);
return
VLC_EGENERIC
;
}
p_sys
->
wraCloseCodec
=
GetProcAddress
(
handle
,
"RACloseCodec"
);
p_sys
->
wraDecode
=
GetProcAddress
(
handle
,
"RADecode"
);
p_sys
->
wraFlush
=
GetProcAddress
(
handle
,
"RAFlush"
);
p_sys
->
wraFreeDecoder
=
GetProcAddress
(
handle
,
"RAFreeDecoder"
);
p_sys
->
wraGetFlavorProperty
=
GetProcAddress
(
handle
,
"RAGetFlavorProperty"
);
p_sys
->
wraOpenCodec
=
GetProcAddress
(
handle
,
"RAOpenCodec"
);
p_sys
->
wraOpenCodec2
=
GetProcAddress
(
handle
,
"RAOpenCodec2"
);
p_sys
->
wraInitDecoder
=
GetProcAddress
(
handle
,
"RAInitDecoder"
);
p_sys
->
wraSetFlavor
=
GetProcAddress
(
handle
,
"RASetFlavor"
);
p_sys
->
wraSetDLLAccessPath
=
GetProcAddress
(
handle
,
"SetDLLAccessPath"
);
p_sys
->
wraSetPwd
=
GetProcAddress
(
handle
,
"RASetPwd"
);
// optional, used by SIPR
if
(
!
(
p_sys
->
wraOpenCodec
||
p_sys
->
wraOpenCodec2
)
||
!
p_sys
->
wraCloseCodec
||
!
p_sys
->
wraInitDecoder
||
!
p_sys
->
wraDecode
||
!
p_sys
->
wraFreeDecoder
||
!
p_sys
->
wraGetFlavorProperty
||
!
p_sys
->
wraSetFlavor
/* || !p_sys->wraFlush || !p_sys->wraSetDLLAccessPath */
)
{
FreeLibrary
(
handle
);
return
VLC_EGENERIC
;
}
if
(
p_sys
->
wraOpenCodec2
)
i_result
=
p_sys
->
wraOpenCodec2
(
&
context
,
psz_path
);
else
i_result
=
p_sys
->
wraOpenCodec
(
&
context
);
if
(
i_result
)
{
msg_Err
(
p_dec
,
"decoder open failed, error code: 0x%x"
,
i_result
);
goto
error_win32
;
}
i_result
=
p_sys
->
wraInitDecoder
(
context
,
&
init_data
);
if
(
i_result
)
{
msg_Err
(
p_dec
,
"decoder init failed, error code: 0x%x"
,
i_result
);
goto
error_win32
;
}
i_result
=
p_sys
->
wraSetFlavor
(
context
,
p_sys
->
i_codec_flavor
);
if
(
i_result
)
{
msg_Err
(
p_dec
,
"decoder flavor setup failed, error code: 0x%x"
,
i_result
);
goto
error_win32
;
}
p_prop
=
p_sys
->
wraGetFlavorProperty
(
context
,
p_sys
->
i_codec_flavor
,
0
,
&
i_prop
);
msg_Dbg
(
p_dec
,
"audio codec: [%d] %s"
,
p_sys
->
i_codec_flavor
,
(
char
*
)
p_prop
);
p_prop
=
p_sys
->
wraGetFlavorProperty
(
context
,
p_sys
->
i_codec_flavor
,
1
,
&
i_prop
);
if
(
p_prop
)
{
int
i_bps
=
((
*
((
int
*
)
p_prop
))
+
4
)
/
8
;
msg_Dbg
(
p_dec
,
"audio bitrate: %5.3f kbit/s (%d bps)"
,
(
*
((
int
*
)
p_prop
))
*
0
.
001
f
,
i_bps
);
}
p_sys
->
context
=
context
;
p_sys
->
win32_dll
=
handle
;
return
VLC_SUCCESS
;
error_win32:
if
(
context
)
p_sys
->
wraFreeDecoder
(
context
);
if
(
context
)
p_sys
->
wraCloseCodec
(
context
);
FreeLibrary
(
handle
);
#endif
return
VLC_EGENERIC
;
}
/*****************************************************************************
* CloseDll:
*****************************************************************************/
static
void
CloseDll
(
decoder_t
*
p_dec
)
{
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
if
(
p_sys
->
context
&&
p_sys
->
dll
)
{
p_sys
->
raFreeDecoder
(
p_sys
->
context
);
p_sys
->
raCloseCodec
(
p_sys
->
context
);
}
if
(
p_sys
->
context
&&
p_sys
->
win32_dll
)
{
p_sys
->
wraFreeDecoder
(
p_sys
->
context
);
p_sys
->
wraCloseCodec
(
p_sys
->
context
);
}
#if defined(HAVE_DL_DLOPEN)
if
(
p_sys
->
dll
)
dlclose
(
p_sys
->
dll
);
#endif
#if defined(LOADER) || defined(WIN32)
if
(
p_sys
->
win32_dll
)
FreeLibrary
(
p_sys
->
win32_dll
);
#if 0 //def LOADER /* Segfaults */
Restore_LDT_Keeper( p_sys->ldt_fs );
msg_Dbg( p_dec, "Restore_LDT_Keeper" );
#endif
#endif
p_sys
->
dll
=
0
;
p_sys
->
win32_dll
=
0
;
p_sys
->
context
=
0
;
}
/*****************************************************************************
* DecodeAudio:
*****************************************************************************/
static
aout_buffer_t
*
Decode
(
decoder_t
*
p_dec
,
block_t
**
pp_block
)
{
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
aout_buffer_t
*
p_aout_buffer
=
0
;
block_t
*
p_block
;
#ifdef LOADER
if
(
!
p_sys
->
win32_dll
&&
!
p_sys
->
dll
)
{
/* We must do open and close in the same thread (unless we do
* Setup_LDT_Keeper in the main thread before all others */
if
(
OpenDll
(
p_dec
)
!=
VLC_SUCCESS
)
{
/* Fatal */
p_dec
->
b_error
=
VLC_TRUE
;
return
NULL
;
}
}
#endif
/* If we have a full frame ready then we can start decoding */
if
(
p_sys
->
i_frame
)
{
char
*
p_out
=
p_sys
->
p_out
;
unsigned
int
i_out
,
i_result
;
int
i_samples
;
if
(
p_sys
->
dll
)
i_result
=
p_sys
->
raDecode
(
p_sys
->
context
,
p_sys
->
p_frame
+
p_sys
->
i_frame_size
-
p_sys
->
i_frame
,
p_dec
->
fmt_in
.
audio
.
i_blockalign
,
p_out
,
&
i_out
,
-
1
);
else
i_result
=
p_sys
->
wraDecode
(
p_sys
->
context
,
p_sys
->
p_frame
+
p_sys
->
i_frame_size
-
p_sys
->
i_frame
,
p_dec
->
fmt_in
.
audio
.
i_blockalign
,
p_out
,
&
i_out
,
-
1
);
i_samples
=
i_out
*
8
/
p_dec
->
fmt_out
.
audio
.
i_bitspersample
/
p_dec
->
fmt_out
.
audio
.
i_channels
;
#if 0
msg_Err( p_dec, "decoded: %i samples (%i)",
i_samples, i_result );
#endif
p_sys
->
i_frame
-=
p_dec
->
fmt_in
.
audio
.
i_blockalign
;
p_aout_buffer
=
p_dec
->
pf_aout_buffer_new
(
p_dec
,
i_samples
);
if
(
p_aout_buffer
==
NULL
)
return
NULL
;
memcpy
(
p_aout_buffer
->
p_buffer
,
p_out
,
i_out
);
/* Date management */
p_aout_buffer
->
start_date
=
aout_DateGet
(
&
p_sys
->
end_date
);
p_aout_buffer
->
end_date
=
aout_DateIncrement
(
&
p_sys
->
end_date
,
i_samples
);
return
p_aout_buffer
;
}
if
(
pp_block
==
NULL
||
*
pp_block
==
NULL
)
return
NULL
;
p_block
=
*
pp_block
;
//msg_Err( p_dec, "Decode: "I64Fd", %i", p_block->i_pts, p_block->i_buffer );
/* Date management */
if
(
/* !p_sys->i_subpacket && */
p_block
&&
p_block
->
i_pts
>
0
&&
p_block
->
i_pts
!=
aout_DateGet
(
&
p_sys
->
end_date
)
)
{
aout_DateSet
(
&
p_sys
->
end_date
,
p_block
->
i_pts
);
}
#if 0
if( !aout_DateGet( &p_sys->end_date ) )
{
/* We've just started the stream, wait for the first PTS. */
if( p_block ) block_Release( p_block );
return NULL;
}
#endif
if
(
p_sys
->
i_subpacket_size
)
{
/* 'cook' way */
int
sps
=
p_sys
->
i_subpacket_size
;
int
w
=
p_dec
->
fmt_in
.
audio
.
i_blockalign
;
int
h
=
p_sys
->
i_subpacket_h
;
/* int cfs = p_sys->i_coded_frame_size; */
int
x
,
y
;
w
/=
sps
;
y
=
p_sys
->
i_subpacket
;
for
(
x
=
0
;
x
<
w
;
x
++
)
{
memcpy
(
p_sys
->
p_frame
+
sps
*
(
h
*
x
+
((
h
+
1
)
/
2
)
*
(
y
&
1
)
+
(
y
>>
1
)),
p_block
->
p_buffer
,
sps
);
p_block
->
p_buffer
+=
sps
;
}
p_sys
->
i_subpacket
=
(
p_sys
->
i_subpacket
+
1
)
%
p_sys
->
i_subpacket_h
;
if
(
!
p_sys
->
i_subpacket
)
{
/* We have a complete frame */
p_sys
->
i_frame
=
p_sys
->
i_frame_size
;
p_aout_buffer
=
Decode
(
p_dec
,
pp_block
);
}
}
block_Release
(
p_block
);
*
pp_block
=
0
;
return
p_aout_buffer
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment