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
28f7772e
Commit
28f7772e
authored
Jun 25, 2008
by
Antoine Cellerier
Committed by
Jean-Paul Saman
Nov 12, 2009
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Start fixing audio decoder. Not done yet.
Signed-off-by:
Jean-Paul Saman
<
jean-paul.saman@m2x.nl
>
parent
f1d6cbe3
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
124 additions
and
46 deletions
+124
-46
modules/codec/davinci/auddec.c
modules/codec/davinci/auddec.c
+116
-45
modules/codec/davinci/davinci.h
modules/codec/davinci/davinci.h
+2
-1
modules/codec/davinci/viddec.c
modules/codec/davinci/viddec.c
+6
-0
No files found.
modules/codec/davinci/auddec.c
View file @
28f7772e
...
@@ -27,6 +27,7 @@
...
@@ -27,6 +27,7 @@
#include "davinci.h"
#include "davinci.h"
#include <ti/sdo/ce/audio/auddec.h>
#include <ti/sdo/ce/audio/auddec.h>
#include <assert.h>
/*****************************************************************************
/*****************************************************************************
* Local prototypes
* Local prototypes
...
@@ -43,6 +44,8 @@ struct decoder_sys_t
...
@@ -43,6 +44,8 @@ struct decoder_sys_t
XDM_BufDesc
in
;
XDM_BufDesc
in
;
XDM_BufDesc
out
;
XDM_BufDesc
out
;
audio_date_t
date
;
};
};
/*****************************************************************************
/*****************************************************************************
...
@@ -118,9 +121,9 @@ int OpenAudioDecoder( vlc_object_t *p_this )
...
@@ -118,9 +121,9 @@ int OpenAudioDecoder( vlc_object_t *p_this )
/* Create audio decoder */
/* Create audio decoder */
params
.
size
=
sizeof
(
params
);
params
.
size
=
sizeof
(
params
);
params
.
maxSampleRate
=
48000
;
/*
in Hz */
params
.
maxSampleRate
=
0
;
/* Use default.
in Hz */
params
.
maxBitrate
=
256000
;
/*
in kbps */
params
.
maxBitrate
=
0
;
/* Use default.
in kbps */
params
.
maxNoOfCh
=
IAUDIO_SEVEN_ONE
;
/* 7.1
*/
params
.
maxNoOfCh
=
0
;
/* Use default
*/
params
.
dataEndianness
=
XDM_BYTE
;
/* FIXME? */
params
.
dataEndianness
=
XDM_BYTE
;
/* FIXME? */
p_sys
->
d
=
AUDDEC_create
(
p_sys
->
e
,
(
String
)
psz_codec
,
&
params
);
p_sys
->
d
=
AUDDEC_create
(
p_sys
->
e
,
(
String
)
psz_codec
,
&
params
);
...
@@ -135,6 +138,16 @@ int OpenAudioDecoder( vlc_object_t *p_this )
...
@@ -135,6 +138,16 @@ int OpenAudioDecoder( vlc_object_t *p_this )
/* Set callbacks */
/* Set callbacks */
p_dec
->
pf_decode_audio
=
DecodeAudioBlock
;
p_dec
->
pf_decode_audio
=
DecodeAudioBlock
;
if
(
p_dec
->
fmt_in
.
audio
.
i_rate
)
{
aout_DateInit
(
&
p_sys
->
date
,
p_dec
->
fmt_in
.
audio
.
i_rate
);
aout_DateSet
(
&
p_sys
->
date
,
0
);
}
p_dec
->
fmt_out
.
i_cat
=
AUDIO_ES
;
p_dec
->
fmt_out
.
i_codec
=
p_dec
->
fmt_out
.
audio
.
i_format
=
AOUT_FMT_S16_NE
;
p_dec
->
fmt_out
.
audio
.
i_bitspersample
=
16
;
#ifdef DEBUG_DAVINCI
#ifdef DEBUG_DAVINCI
msg_Info
(
p_dec
,
"Wooooohooo!"
);
msg_Info
(
p_dec
,
"Wooooohooo!"
);
#endif
#endif
...
@@ -180,7 +193,6 @@ void CloseAudioDecoder( vlc_object_t *p_this )
...
@@ -180,7 +193,6 @@ void CloseAudioDecoder( vlc_object_t *p_this )
*****************************************************************************/
*****************************************************************************/
static
aout_buffer_t
*
DecodeAudioBlock
(
decoder_t
*
p_dec
,
block_t
**
pp_block
)
static
aout_buffer_t
*
DecodeAudioBlock
(
decoder_t
*
p_dec
,
block_t
**
pp_block
)
{
{
#if 0
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
block_t
*
p_block
;
block_t
*
p_block
;
aout_buffer_t
*
p_out
=
NULL
;
aout_buffer_t
*
p_out
=
NULL
;
...
@@ -197,18 +209,33 @@ static aout_buffer_t *DecodeAudioBlock( decoder_t *p_dec, block_t **pp_block )
...
@@ -197,18 +209,33 @@ static aout_buffer_t *DecodeAudioBlock( decoder_t *p_dec, block_t **pp_block )
msg_Err
(
p_dec
,
"DecodeAudioBlock starts now!"
);
msg_Err
(
p_dec
,
"DecodeAudioBlock starts now!"
);
#endif
#endif
if
(
p_block
->
i_flags
&
(
BLOCK_FLAG_DISCONTINUITY
|
BLOCK_FLAG_CORRUPTED
)
)
{
block_Release
(
p_block
);
return
NULL
;
}
memset
(
&
in_args
,
0
,
sizeof
(
in_args
)
);
memset
(
&
in_args
,
0
,
sizeof
(
in_args
)
);
memset
(
&
out_args
,
0
,
sizeof
(
out_args
)
);
memset
(
&
out_args
,
0
,
sizeof
(
out_args
)
);
/* Configure audio decoder */
dparams
.
size
=
sizeof
(
dparams
);
dparams
.
size
=
sizeof
(
dparams
);
memset
(
&
status
,
0
,
sizeof
(
status
)
);
memset
(
&
status
,
0
,
sizeof
(
status
)
);
status
.
size
=
sizeof
(
status
);
status
.
size
=
sizeof
(
status
);
if
(
p_sys
->
in
.
numBufs
==
0
||
p_sys
->
out
.
numBufs
==
0
)
if
(
p_sys
->
in
.
numBufs
==
0
||
p_sys
->
out
.
numBufs
==
0
)
{
{
/* Configure audio decoder */
dparams
.
outputFormat
=
IAUDIO_INTERLEAVED
;
if
(
AUDDEC_control
(
p_sys
->
d
,
XDM_SETPARAMS
,
&
dparams
,
&
status
)
!=
AUDDEC_EOK
)
{
msg_Err
(
p_dec
,
"Failed to set dynamic decoder parameters"
);
goto
error
;
}
if
(
AUDDEC_control
(
p_sys
->
d
,
XDM_GETBUFINFO
,
&
dparams
,
&
status
)
if
(
AUDDEC_control
(
p_sys
->
d
,
XDM_GETBUFINFO
,
&
dparams
,
&
status
)
!=
VI
DDEC_EOK )
!=
AU
DDEC_EOK
)
{
{
msg_Err
(
p_dec
,
"Failed to get buffer info"
);
msg_Err
(
p_dec
,
"Failed to get buffer info"
);
goto
error
;
goto
error
;
...
@@ -235,21 +262,32 @@ static aout_buffer_t *DecodeAudioBlock( decoder_t *p_dec, block_t **pp_block )
...
@@ -235,21 +262,32 @@ static aout_buffer_t *DecodeAudioBlock( decoder_t *p_dec, block_t **pp_block )
/* Setup input arguments */
/* Setup input arguments */
in_args
.
size
=
sizeof
(
in_args
);
in_args
.
size
=
sizeof
(
in_args
);
in_args.numBytes = __MIN( p_block->i_buffer, p_sys->in.bufSizes[0] );
in_args
.
numBytes
=
__MIN
(
p_dec
->
fmt_in
.
i_extra
+
p_block
->
i_buffer
,
p_sys
->
in
.
bufSizes
[
0
]
);
/* Setup input buffer */
/* Setup input buffer */
#ifdef DEBUG_DAVINCI
#ifdef DEBUG_DAVINCI
if
(
p_block
->
i_buffer
>
p_sys
->
in
.
bufSizes
[
0
]
)
if
(
p_block
->
i_buffer
>
p_sys
->
in
.
bufSizes
[
0
]
)
msg_Dbg
(
p_dec
,
"Woah! Not enough room to store the whole block"
);
msg_Dbg
(
p_dec
,
"Woah! Not enough room to store the whole block"
);
#endif
#endif
memcpy( p_sys->in.bufs[0], p_block->p_buffer, in_args.numBytes );
if
(
p_dec
->
fmt_in
.
i_extra
>
0
)
{
memcpy
(
p_sys
->
in
.
bufs
[
0
],
p_dec
->
fmt_in
.
p_extra
,
p_dec
->
fmt_in
.
i_extra
);
}
memcpy
(
p_sys
->
in
.
bufs
[
0
]
+
p_dec
->
fmt_in
.
i_extra
,
p_block
->
p_buffer
,
in_args
.
numBytes
-
p_dec
->
fmt_in
.
i_extra
);
#ifdef DEBUG_DAVINCI
msg_Dbg
(
p_dec
,
"Sending %d + %d bytes"
,
p_dec
->
fmt_in
.
i_extra
,
(
int
)
in_args
.
numBytes
-
p_dec
->
fmt_in
.
i_extra
);
#endif
/* Setup output arguments */
/* Setup output arguments */
out_args
.
size
=
sizeof
(
out_args
);
out_args
.
size
=
sizeof
(
out_args
);
/* Decode the audio */
/* Decode the audio */
i
=
AUDDEC_process
(
p_sys
->
d
,
&
p_sys
->
in
,
&
p_sys
->
out
,
&
in_args
,
&
out_args
);
i
=
AUDDEC_process
(
p_sys
->
d
,
&
p_sys
->
in
,
&
p_sys
->
out
,
&
in_args
,
&
out_args
);
if( i !=
VI
DDEC_EOK )
if
(
i
!=
AU
DDEC_EOK
)
{
{
msg_Err
(
p_dec
,
"Audio decoding failed (Error code: %d, "
msg_Err
(
p_dec
,
"Audio decoding failed (Error code: %d, "
"Extended error: %x)"
,
i
,
(
int
)
out_args
.
extendedError
);
"Extended error: %x)"
,
i
,
(
int
)
out_args
.
extendedError
);
...
@@ -257,54 +295,88 @@ static aout_buffer_t *DecodeAudioBlock( decoder_t *p_dec, block_t **pp_block )
...
@@ -257,54 +295,88 @@ static aout_buffer_t *DecodeAudioBlock( decoder_t *p_dec, block_t **pp_block )
goto
error
;
goto
error
;
}
}
if(
VI
DDEC_control( p_sys->d, XDM_GETSTATUS, &dparams, &status ) != AUDDEC_EOK )
if
(
AU
DDEC_control
(
p_sys
->
d
,
XDM_GETSTATUS
,
&
dparams
,
&
status
)
!=
AUDDEC_EOK
)
{
{
msg_Err
(
p_dec
,
"Failed to get decoder status"
);
msg_Err
(
p_dec
,
"Failed to get decoder status"
);
goto
error
;
goto
error
;
}
}
p_block->p_buffer += out_args.bytesConsumed;
#ifdef DEBUG_DAVINCI
p_block->i_buffer -= out_args.bytesConsumed;
msg_Dbg
(
p_dec
,
"Bytes consumed: %d"
,
(
int
)
out_args
.
bytesConsumed
);
#endif
p_dec->fmt_out.audio.i_rate = status.sampleRate;
p_block
->
p_buffer
+=
out_args
.
bytesConsumed
-
p_dec
->
fmt_in
.
i_extra
;
p_block
->
i_buffer
-=
out_args
.
bytesConsumed
-
p_dec
->
fmt_in
.
i_extra
;
switch( status.numChannels
)
if
(
p_dec
->
fmt_out
.
audio
.
i_rate
!=
(
unsigned
int
)
status
.
sampleRate
)
{
{
case IAUDIO_MONO:
msg_Dbg
(
p_dec
,
"Setting audio output format info"
);
i = AOUT_VAR_MONO;
break;
p_dec
->
fmt_out
.
audio
.
i_rate
=
status
.
sampleRate
;
case IAUDIO_STEREO:
msg_Dbg
(
p_dec
,
"Rate: %d"
,
p_dec
->
fmt_out
.
audio
.
i_rate
);
i = AOUT_VAR_STEREO;
aout_DateInit
(
&
p_sys
->
date
,
p_dec
->
fmt_out
.
audio
.
i_rate
);
break;
aout_DateSet
(
&
p_sys
->
date
,
p_block
->
i_pts
);
case IAUDIO_THREE_ZERO:
i = 3; /* FIXME? */
p_dec
->
fmt_out
.
audio
.
i_channels
=
status
.
numChannels
;
break;
switch
(
status
.
numChannels
)
case IAUDIO_FIVE_ZERO:
{
i = AOUT_VAR_3F2R;
case
IAUDIO_MONO
:
break;
i
=
AOUT_CHAN_CENTER
;
case IAUDIO_FIVE_ONE:
break
;
i = AOUT_VAR_5_1;
case
IAUDIO_STEREO
:
break;
i
=
AOUT_CHAN_LEFT
|
AOUT_CHAN_RIGHT
;
case IAUDIO_SEVEN_ONE:
break
;
i = AOUT_VAR_7_1;
case
IAUDIO_THREE_ZERO
:
break;
i
=
AOUT_CHAN_LEFT
|
AOUT_CHAN_RIGHT
|
AOUT_CHAN_LFE
;
default:
break
;
msg_Warn( p_dec, "Unknown numChannels (%d)", status.numChannels );
case
IAUDIO_FIVE_ZERO
:
i = status.numChannels;
i
=
AOUT_CHAN_LEFT
|
AOUT_CHAN_RIGHT
|
AOUT_CHAN_REARLEFT
|
AOUT_CHAN_REARRIGHT
|
AOUT_CHAN_CENTER
;
break;
break
;
case
IAUDIO_FIVE_ONE
:
i
=
AOUT_CHAN_LEFT
|
AOUT_CHAN_RIGHT
|
AOUT_CHAN_REARLEFT
|
AOUT_CHAN_REARRIGHT
|
AOUT_CHAN_CENTER
|
AOUT_CHAN_LFE
;
break
;
case
IAUDIO_SEVEN_ONE
:
i
=
AOUT_CHAN_LEFT
|
AOUT_CHAN_RIGHT
|
AOUT_CHAN_MIDDLELEFT
|
AOUT_CHAN_MIDDLERIGHT
|
AOUT_CHAN_REARLEFT
|
AOUT_CHAN_REARRIGHT
|
AOUT_CHAN_CENTER
|
AOUT_CHAN_LFE
;
break
;
default:
msg_Warn
(
p_dec
,
"Unknown numChannels (%d)"
,
(
int
)
status
.
numChannels
);
i
=
status
.
numChannels
;
break
;
}
p_dec
->
fmt_out
.
audio
.
i_physical_channels
=
p_dec
->
fmt_out
.
audio
.
i_original_channels
=
i
;
msg_Dbg
(
p_dec
,
"Channels: %d"
,
p_dec
->
fmt_out
.
audio
.
i_original_channels
);
p_dec
->
fmt_out
.
audio
.
i_bitspersample
=
status
.
outputBitsPerSample
;
msg_Dbg
(
p_dec
,
"Bits per sample: %d"
,
p_dec
->
fmt_out
.
audio
.
i_bitspersample
);
assert
(
p_dec
->
fmt_out
.
audio
.
i_bitspersample
==
16
);
}
}
p_dec->fmt_out.audio.i_physical_channels =
p_dec->fmt_out.audio.i_original_channels =
p_dec->fmt_out.audio.i_channels = i;
p_dec->fmt_out.audio.i_bitspersample = status.outputBitsPerSample;
if
(
p_block
->
i_pts
!=
0
&&
p_block
->
i_pts
!=
aout_DateGet
(
&
p_sys
->
date
)
)
{
aout_DateSet
(
&
p_sys
->
date
,
p_block
->
i_pts
);
}
else
if
(
!
aout_DateGet
(
&
p_sys
->
date
)
)
{
/* We're still waiting for a pts */
goto
error
;
}
p_out = p_dec->pf_aout_buffer_new( p_dec, status.frameLen /
p_out
=
p_dec
->
pf_aout_buffer_new
(
p_dec
,
status
.
frameLen
/
2
/
p_dec
->
fmt_out
.
audio
.
i_channels
);
p_dec
->
fmt_out
.
audio
.
i_channels
);
p_out->start_date =
p_out->end_date =
p_out->p_buffer =
p_out
->
start_date
=
aout_DateGet
(
&
p_sys
->
date
);
p_out
->
end_date
=
aout_DateIncrement
(
&
p_sys
->
date
,
status
.
frameLen
/
2
/
p_dec
->
fmt_out
.
audio
.
i_channels
);
memcpy
(
p_out
->
p_buffer
,
p_sys
->
out
.
bufs
[
0
],
p_out
->
i_nb_bytes
);
if
(
p_block
->
i_buffer
==
0
)
{
block_Release
(
p_block
);
*
pp_block
=
NULL
;
}
msg_Info
(
p_dec
,
"Audio samples incoming ... get ready!"
);
return
p_out
;
return
p_out
;
...
@@ -312,6 +384,5 @@ static aout_buffer_t *DecodeAudioBlock( decoder_t *p_dec, block_t **pp_block )
...
@@ -312,6 +384,5 @@ static aout_buffer_t *DecodeAudioBlock( decoder_t *p_dec, block_t **pp_block )
if
(
p_out
&&
p_out
->
pf_release
)
if
(
p_out
&&
p_out
->
pf_release
)
p_out
->
pf_release
(
p_out
);
p_out
->
pf_release
(
p_out
);
block_Release
(
p_block
);
block_Release
(
p_block
);
#endif
return
NULL
;
return
NULL
;
}
}
modules/codec/davinci/davinci.h
View file @
28f7772e
...
@@ -34,7 +34,7 @@
...
@@ -34,7 +34,7 @@
#include <ti/sdo/ce/CERuntime.h>
#include <ti/sdo/ce/CERuntime.h>
#include <ti/sdo/ce/Engine.h>
#include <ti/sdo/ce/Engine.h>
/* #define DEBUG_DAVINCI */
#define DEBUG_DAVINCI
int
OpenVideoDecoder
(
vlc_object_t
*
);
int
OpenVideoDecoder
(
vlc_object_t
*
);
void
CloseVideoDecoder
(
vlc_object_t
*
);
void
CloseVideoDecoder
(
vlc_object_t
*
);
...
@@ -171,6 +171,7 @@ extern const char *ppsz_engine_error[];
...
@@ -171,6 +171,7 @@ extern const char *ppsz_engine_error[];
case VLC_FOURCC('w','v','c','1'):
case VLC_FOURCC('w','v','c','1'):
#define CASE_MP3 \
#define CASE_MP3 \
case VLC_FOURCC('m','p','g','a'): \
case VLC_FOURCC('m','p','3',' '): \
case VLC_FOURCC('m','p','3',' '): \
case VLC_FOURCC('.','m','p','3'): \
case VLC_FOURCC('.','m','p','3'): \
case VLC_FOURCC('M','P','3',' '): \
case VLC_FOURCC('M','P','3',' '): \
...
...
modules/codec/davinci/viddec.c
View file @
28f7772e
...
@@ -244,6 +244,12 @@ static picture_t *DecodeVideoBlock( decoder_t *p_dec, block_t **pp_block )
...
@@ -244,6 +244,12 @@ static picture_t *DecodeVideoBlock( decoder_t *p_dec, block_t **pp_block )
msg_Err
(
p_dec
,
"DecodeVideoBlock starts now!"
);
msg_Err
(
p_dec
,
"DecodeVideoBlock starts now!"
);
#endif
#endif
if
(
p_block
->
i_flags
&
(
BLOCK_FLAG_DISCONTINUITY
|
BLOCK_FLAG_CORRUPTED
)
)
{
block_Release
(
p_block
);
return
NULL
;
}
memset
(
&
in_args
,
0
,
sizeof
(
in_args
)
);
memset
(
&
in_args
,
0
,
sizeof
(
in_args
)
);
memset
(
&
out_args
,
0
,
sizeof
(
out_args
)
);
memset
(
&
out_args
,
0
,
sizeof
(
out_args
)
);
...
...
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