Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
002097a0
Commit
002097a0
authored
Oct 23, 2012
by
Justin Ruggles
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wmapro: use AVCodecContext.channels instead of keeping a private copy
parent
2ed40608
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
25 additions
and
27 deletions
+25
-27
wmaprodec.c
libavcodec/wmaprodec.c
+25
-27
No files found.
libavcodec/wmaprodec.c
View file @
002097a0
...
...
@@ -184,7 +184,6 @@ typedef struct WMAProDecodeCtx {
uint8_t
bits_per_sample
;
///< integer audio sample size for the unscaled IMDCT output (used to scale to [-1.0, 1.0])
uint16_t
samples_per_frame
;
///< number of samples to output
uint16_t
log2_frame_size
;
int8_t
num_channels
;
///< number of channels in the stream (same as AVCodecContext.num_channels)
int8_t
lfe_channel
;
///< lfe channel index
uint8_t
max_num_subframes
;
uint8_t
subframe_len_bits
;
///< number of bits used for the subframe length
...
...
@@ -246,7 +245,7 @@ static av_cold void dump_context(WMAProDecodeCtx *s)
PRINT
(
"log2 frame size"
,
s
->
log2_frame_size
);
PRINT
(
"max num subframes"
,
s
->
max_num_subframes
);
PRINT
(
"len prefix"
,
s
->
len_prefix
);
PRINT
(
"num channels"
,
s
->
num_
channels
);
PRINT
(
"num channels"
,
s
->
avctx
->
channels
);
}
/**
...
...
@@ -337,18 +336,17 @@ static av_cold int decode_init(AVCodecContext *avctx)
return
AVERROR_INVALIDDATA
;
}
s
->
num_channels
=
avctx
->
channels
;
if
(
s
->
num_channels
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid number of channels %d
\n
"
,
s
->
num_channels
);
if
(
avctx
->
channels
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"invalid number of channels %d
\n
"
,
avctx
->
channels
);
return
AVERROR_INVALIDDATA
;
}
else
if
(
s
->
num_
channels
>
WMAPRO_MAX_CHANNELS
)
{
}
else
if
(
avctx
->
channels
>
WMAPRO_MAX_CHANNELS
)
{
av_log_ask_for_sample
(
avctx
,
"unsupported number of channels
\n
"
);
return
AVERROR_PATCHWELCOME
;
}
/** init previous block len */
for
(
i
=
0
;
i
<
s
->
num_
channels
;
i
++
)
for
(
i
=
0
;
i
<
avctx
->
channels
;
i
++
)
s
->
channel
[
i
].
prev_block_len
=
s
->
samples_per_frame
;
/** extract lfe channel position */
...
...
@@ -525,7 +523,7 @@ static int decode_tilehdr(WMAProDecodeCtx *s)
{
uint16_t
num_samples
[
WMAPRO_MAX_CHANNELS
]
=
{
0
};
/**< sum of samples for all currently known subframes of a channel */
uint8_t
contains_subframe
[
WMAPRO_MAX_CHANNELS
];
/**< flag indicating if a channel contains the current subframe */
int
channels_for_cur_subframe
=
s
->
num_channels
;
/**< number of channels that contain the current subframe */
int
channels_for_cur_subframe
=
s
->
avctx
->
channels
;
/**< number of channels that contain the current subframe */
int
fixed_channel_layout
=
0
;
/**< flag indicating that all channels use the same subframe offsets and sizes */
int
min_channel_len
=
0
;
/**< smallest sum of samples (channels with this length will be processed first) */
int
c
;
...
...
@@ -537,7 +535,7 @@ static int decode_tilehdr(WMAProDecodeCtx *s)
*/
/** reset tiling information */
for
(
c
=
0
;
c
<
s
->
num_
channels
;
c
++
)
for
(
c
=
0
;
c
<
s
->
avctx
->
channels
;
c
++
)
s
->
channel
[
c
].
num_subframes
=
0
;
if
(
s
->
max_num_subframes
==
1
||
get_bits1
(
&
s
->
gb
))
...
...
@@ -548,7 +546,7 @@ static int decode_tilehdr(WMAProDecodeCtx *s)
int
subframe_len
;
/** check which channels contain the subframe */
for
(
c
=
0
;
c
<
s
->
num_
channels
;
c
++
)
{
for
(
c
=
0
;
c
<
s
->
avctx
->
channels
;
c
++
)
{
if
(
num_samples
[
c
]
==
min_channel_len
)
{
if
(
fixed_channel_layout
||
channels_for_cur_subframe
==
1
||
(
min_channel_len
==
s
->
samples_per_frame
-
s
->
min_samples_per_subframe
))
...
...
@@ -565,7 +563,7 @@ static int decode_tilehdr(WMAProDecodeCtx *s)
/** add subframes to the individual channels and find new min_channel_len */
min_channel_len
+=
subframe_len
;
for
(
c
=
0
;
c
<
s
->
num_
channels
;
c
++
)
{
for
(
c
=
0
;
c
<
s
->
avctx
->
channels
;
c
++
)
{
WMAProChannelCtx
*
chan
=
&
s
->
channel
[
c
];
if
(
contains_subframe
[
c
])
{
...
...
@@ -592,7 +590,7 @@ static int decode_tilehdr(WMAProDecodeCtx *s)
}
}
while
(
min_channel_len
<
s
->
samples_per_frame
);
for
(
c
=
0
;
c
<
s
->
num_
channels
;
c
++
)
{
for
(
c
=
0
;
c
<
s
->
avctx
->
channels
;
c
++
)
{
int
i
;
int
offset
=
0
;
for
(
i
=
0
;
i
<
s
->
channel
[
c
].
num_subframes
;
i
++
)
{
...
...
@@ -618,8 +616,8 @@ static void decode_decorrelation_matrix(WMAProDecodeCtx *s,
int
i
;
int
offset
=
0
;
int8_t
rotation_offset
[
WMAPRO_MAX_CHANNELS
*
WMAPRO_MAX_CHANNELS
];
memset
(
chgroup
->
decorrelation_matrix
,
0
,
s
->
num_
channels
*
s
->
num_
channels
*
sizeof
(
*
chgroup
->
decorrelation_matrix
));
memset
(
chgroup
->
decorrelation_matrix
,
0
,
s
->
avctx
->
channels
*
s
->
avctx
->
channels
*
sizeof
(
*
chgroup
->
decorrelation_matrix
));
for
(
i
=
0
;
i
<
chgroup
->
num_channels
*
(
chgroup
->
num_channels
-
1
)
>>
1
;
i
++
)
rotation_offset
[
i
]
=
get_bits
(
&
s
->
gb
,
6
);
...
...
@@ -672,7 +670,7 @@ static int decode_channel_transform(WMAProDecodeCtx* s)
/** in the one channel case channel transforms are pointless */
s
->
num_chgroups
=
0
;
if
(
s
->
num_
channels
>
1
)
{
if
(
s
->
avctx
->
channels
>
1
)
{
int
remaining_channels
=
s
->
channels_for_cur_subframe
;
if
(
get_bits1
(
&
s
->
gb
))
{
...
...
@@ -718,7 +716,7 @@ static int decode_channel_transform(WMAProDecodeCtx* s)
}
}
else
{
chgroup
->
transform
=
1
;
if
(
s
->
num_
channels
==
2
)
{
if
(
s
->
avctx
->
channels
==
2
)
{
chgroup
->
decorrelation_matrix
[
0
]
=
1
.
0
;
chgroup
->
decorrelation_matrix
[
1
]
=
-
1
.
0
;
chgroup
->
decorrelation_matrix
[
2
]
=
1
.
0
;
...
...
@@ -1008,7 +1006,7 @@ static void inverse_channel_transform(WMAProDecodeCtx *s)
(
*
ch
)[
y
]
=
sum
;
}
}
}
else
if
(
s
->
num_
channels
==
2
)
{
}
else
if
(
s
->
avctx
->
channels
==
2
)
{
int
len
=
FFMIN
(
sfb
[
1
],
s
->
subframe_len
)
-
sfb
[
0
];
s
->
dsp
.
vector_fmul_scalar
(
ch_data
[
0
]
+
sfb
[
0
],
ch_data
[
0
]
+
sfb
[
0
],
...
...
@@ -1061,7 +1059,7 @@ static int decode_subframe(WMAProDecodeCtx *s)
int
offset
=
s
->
samples_per_frame
;
int
subframe_len
=
s
->
samples_per_frame
;
int
i
;
int
total_samples
=
s
->
samples_per_frame
*
s
->
num_
channels
;
int
total_samples
=
s
->
samples_per_frame
*
s
->
avctx
->
channels
;
int
transmit_coeffs
=
0
;
int
cur_subwoofer_cutoff
;
...
...
@@ -1071,7 +1069,7 @@ static int decode_subframe(WMAProDecodeCtx *s)
== the next block of the channel with the smallest number of
decoded samples
*/
for
(
i
=
0
;
i
<
s
->
num_
channels
;
i
++
)
{
for
(
i
=
0
;
i
<
s
->
avctx
->
channels
;
i
++
)
{
s
->
channel
[
i
].
grouped
=
0
;
if
(
offset
>
s
->
channel
[
i
].
decoded_samples
)
{
offset
=
s
->
channel
[
i
].
decoded_samples
;
...
...
@@ -1085,7 +1083,7 @@ static int decode_subframe(WMAProDecodeCtx *s)
/** get a list of all channels that contain the estimated block */
s
->
channels_for_cur_subframe
=
0
;
for
(
i
=
0
;
i
<
s
->
num_
channels
;
i
++
)
{
for
(
i
=
0
;
i
<
s
->
avctx
->
channels
;
i
++
)
{
const
int
cur_subframe
=
s
->
channel
[
i
].
cur_subframe
;
/** substract already processed samples */
total_samples
-=
s
->
channel
[
i
].
decoded_samples
;
...
...
@@ -1314,9 +1312,9 @@ static int decode_frame(WMAProDecodeCtx *s, int *got_frame_ptr)
}
/** read postproc transform */
if
(
s
->
num_
channels
>
1
&&
get_bits1
(
gb
))
{
if
(
s
->
avctx
->
channels
>
1
&&
get_bits1
(
gb
))
{
if
(
get_bits1
(
gb
))
{
for
(
i
=
0
;
i
<
s
->
num_channels
*
s
->
num_
channels
;
i
++
)
for
(
i
=
0
;
i
<
avctx
->
channels
*
avctx
->
channels
;
i
++
)
skip_bits
(
gb
,
4
);
}
}
...
...
@@ -1351,7 +1349,7 @@ static int decode_frame(WMAProDecodeCtx *s, int *got_frame_ptr)
/** reset subframe states */
s
->
parsed_all_subframes
=
0
;
for
(
i
=
0
;
i
<
s
->
num_
channels
;
i
++
)
{
for
(
i
=
0
;
i
<
avctx
->
channels
;
i
++
)
{
s
->
channel
[
i
].
decoded_samples
=
0
;
s
->
channel
[
i
].
cur_subframe
=
0
;
s
->
channel
[
i
].
reuse_sf
=
0
;
...
...
@@ -1374,11 +1372,11 @@ static int decode_frame(WMAProDecodeCtx *s, int *got_frame_ptr)
}
/** copy samples to the output buffer */
for
(
i
=
0
;
i
<
s
->
num_
channels
;
i
++
)
for
(
i
=
0
;
i
<
avctx
->
channels
;
i
++
)
memcpy
(
s
->
frame
.
extended_data
[
i
],
s
->
channel
[
i
].
out
,
s
->
samples_per_frame
*
sizeof
(
*
s
->
channel
[
i
].
out
));
for
(
i
=
0
;
i
<
s
->
num_
channels
;
i
++
)
{
for
(
i
=
0
;
i
<
avctx
->
channels
;
i
++
)
{
/** reuse second half of the IMDCT output for the next frame */
memcpy
(
&
s
->
channel
[
i
].
out
[
0
],
&
s
->
channel
[
i
].
out
[
s
->
samples_per_frame
],
...
...
@@ -1608,7 +1606,7 @@ static void flush(AVCodecContext *avctx)
int
i
;
/** reset output buffer as a part of it is used during the windowing of a
new frame */
for
(
i
=
0
;
i
<
s
->
num_
channels
;
i
++
)
for
(
i
=
0
;
i
<
avctx
->
channels
;
i
++
)
memset
(
s
->
channel
[
i
].
out
,
0
,
s
->
samples_per_frame
*
sizeof
(
*
s
->
channel
[
i
].
out
));
s
->
packet_loss
=
1
;
...
...
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