Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Yushin Cho
aom-rav1e
Commits
625fbb30
Commit
625fbb30
authored
Jun 19, 2014
by
hkuang
Committed by
Gerrit Code Review
Jun 19, 2014
Browse files
Merge "Add superframe support for frame parallel decoding."
parents
b202e475
1eb6e683
Changes
1
Hide whitespace changes
Inline
Side-by-side
vp9/vp9_dx_iface.c
View file @
625fbb30
...
...
@@ -356,7 +356,8 @@ static vpx_codec_err_t decoder_decode(vpx_codec_alg_priv_t *ctx,
const
uint8_t
*
data
,
unsigned
int
data_sz
,
void
*
user_priv
,
long
deadline
)
{
const
uint8_t
*
data_start
=
data
;
const
uint8_t
*
const
data_end
=
data
+
data_sz
;
const
uint8_t
*
const
data_end
=
data
+
data_sz
;
vpx_codec_err_t
res
;
uint32_t
frame_sizes
[
8
];
int
frame_count
;
...
...
@@ -366,40 +367,80 @@ static vpx_codec_err_t decoder_decode(vpx_codec_alg_priv_t *ctx,
parse_superframe_index
(
data
,
data_sz
,
frame_sizes
,
&
frame_count
,
ctx
->
decrypt_cb
,
ctx
->
decrypt_state
);
if
(
frame_count
>
0
)
{
int
i
;
for
(
i
=
0
;
i
<
frame_count
;
++
i
)
{
const
uint8_t
*
data_start_copy
=
data_start
;
const
uint32_t
frame_size
=
frame_sizes
[
i
];
vpx_codec_err_t
res
;
if
(
data_start
<
data
||
frame_size
>
(
uint32_t
)(
data_end
-
data_start
))
{
ctx
->
base
.
err_detail
=
"Invalid frame size in index"
;
return
VPX_CODEC_CORRUPT_FRAME
;
}
if
(
ctx
->
frame_parallel_decode
)
{
// Decode in frame parallel mode. When decoding in this mode, the frame
// passed to the decoder must be either a normal frame or a superframe with
// superframe index so the decoder could get each frame's start position
// in the superframe.
if
(
frame_count
>
0
)
{
int
i
;
for
(
i
=
0
;
i
<
frame_count
;
++
i
)
{
const
uint8_t
*
data_start_copy
=
data_start
;
const
uint32_t
frame_size
=
frame_sizes
[
i
];
vpx_codec_err_t
res
;
if
(
data_start
<
data
||
frame_size
>
(
uint32_t
)
(
data_end
-
data_start
))
{
ctx
->
base
.
err_detail
=
"Invalid frame size in index"
;
return
VPX_CODEC_CORRUPT_FRAME
;
}
res
=
decode_one
(
ctx
,
&
data_start_copy
,
frame_size
,
user_priv
,
deadline
);
res
=
decode_one
(
ctx
,
&
data_start_copy
,
frame_size
,
user_priv
,
deadline
);
if
(
res
!=
VPX_CODEC_OK
)
return
res
;
data_start
+=
frame_size
;
}
}
else
{
res
=
decode_one
(
ctx
,
&
data_start
,
data_sz
,
user_priv
,
deadline
);
if
(
res
!=
VPX_CODEC_OK
)
return
res
;
data_start
+=
frame_size
;
// Extra data detected after the frame.
if
(
data_start
<
data_end
-
1
)
{
ctx
->
base
.
err_detail
=
"Fail to decode frame in parallel mode"
;
return
VPX_CODEC_INCAPABLE
;
}
}
}
else
{
while
(
data_start
<
data_end
)
{
const
uint32_t
frame_size
=
(
uint32_t
)(
data_end
-
data_start
);
const
vpx_codec_err_t
res
=
decode_one
(
ctx
,
&
data_start
,
frame_size
,
user_priv
,
deadline
);
if
(
res
!=
VPX_CODEC_OK
)
return
res
;
// Decode in serial mode.
if
(
frame_count
>
0
)
{
int
i
;
for
(
i
=
0
;
i
<
frame_count
;
++
i
)
{
const
uint8_t
*
data_start_copy
=
data_start
;
const
uint32_t
frame_size
=
frame_sizes
[
i
];
vpx_codec_err_t
res
;
if
(
data_start
<
data
||
frame_size
>
(
uint32_t
)
(
data_end
-
data_start
))
{
ctx
->
base
.
err_detail
=
"Invalid frame size in index"
;
return
VPX_CODEC_CORRUPT_FRAME
;
}
res
=
decode_one
(
ctx
,
&
data_start_copy
,
frame_size
,
user_priv
,
deadline
);
if
(
res
!=
VPX_CODEC_OK
)
return
res
;
// Account for suboptimal termination by the encoder.
data_start
+=
frame_size
;
}
}
else
{
while
(
data_start
<
data_end
)
{
const
uint8_t
marker
=
read_marker
(
ctx
->
decrypt_cb
,
ctx
->
decrypt_state
,
data_start
);
if
(
marker
)
break
;
++
data_start
;
const
uint32_t
frame_size
=
(
uint32_t
)
(
data_end
-
data_start
);
const
vpx_codec_err_t
res
=
decode_one
(
ctx
,
&
data_start
,
frame_size
,
user_priv
,
deadline
);
if
(
res
!=
VPX_CODEC_OK
)
return
res
;
// Account for suboptimal termination by the encoder.
while
(
data_start
<
data_end
)
{
const
uint8_t
marker
=
read_marker
(
ctx
->
decrypt_cb
,
ctx
->
decrypt_state
,
data_start
);
if
(
marker
)
break
;
++
data_start
;
}
}
}
}
...
...
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