Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
ffae62d9
Commit
ffae62d9
authored
Mar 23, 2020
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
vp9dec: support exporting QP tables through the AVVideoEncParams API
parent
c90f57c6
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
102 additions
and
0 deletions
+102
-0
vp9.c
libavcodec/vp9.c
+72
-0
vp9block.c
libavcodec/vp9block.c
+8
-0
vp9dec.h
libavcodec/vp9dec.h
+7
-0
video_enc_params.h
libavutil/video_enc_params.h
+15
-0
No files found.
libavcodec/vp9.c
View file @
ffae62d9
...
@@ -34,6 +34,7 @@
...
@@ -34,6 +34,7 @@
#include "vp9dec.h"
#include "vp9dec.h"
#include "libavutil/avassert.h"
#include "libavutil/avassert.h"
#include "libavutil/pixdesc.h"
#include "libavutil/pixdesc.h"
#include "libavutil/video_enc_params.h"
#define VP9_SYNCCODE 0x498342
#define VP9_SYNCCODE 0x498342
...
@@ -97,6 +98,7 @@ static void vp9_tile_data_free(VP9TileData *td)
...
@@ -97,6 +98,7 @@ static void vp9_tile_data_free(VP9TileData *td)
{
{
av_freep
(
&
td
->
b_base
);
av_freep
(
&
td
->
b_base
);
av_freep
(
&
td
->
block_base
);
av_freep
(
&
td
->
block_base
);
av_freep
(
&
td
->
block_structure
);
}
}
static
void
vp9_frame_unref
(
AVCodecContext
*
avctx
,
VP9Frame
*
f
)
static
void
vp9_frame_unref
(
AVCodecContext
*
avctx
,
VP9Frame
*
f
)
...
@@ -326,6 +328,12 @@ static int update_block_buffers(AVCodecContext *avctx)
...
@@ -326,6 +328,12 @@ static int update_block_buffers(AVCodecContext *avctx)
td
->
eob_base
=
(
uint8_t
*
)
(
td
->
uvblock_base
[
1
]
+
sbs
*
chroma_blocks
*
bytesperpixel
);
td
->
eob_base
=
(
uint8_t
*
)
(
td
->
uvblock_base
[
1
]
+
sbs
*
chroma_blocks
*
bytesperpixel
);
td
->
uveob_base
[
0
]
=
td
->
eob_base
+
16
*
16
*
sbs
;
td
->
uveob_base
[
0
]
=
td
->
eob_base
+
16
*
16
*
sbs
;
td
->
uveob_base
[
1
]
=
td
->
uveob_base
[
0
]
+
chroma_eobs
*
sbs
;
td
->
uveob_base
[
1
]
=
td
->
uveob_base
[
0
]
+
chroma_eobs
*
sbs
;
if
(
avctx
->
export_side_data
&
AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS
)
{
td
->
block_structure
=
av_malloc_array
(
s
->
cols
*
s
->
rows
,
sizeof
(
*
td
->
block_structure
));
if
(
!
td
->
block_structure
)
return
AVERROR
(
ENOMEM
);
}
}
else
{
}
else
{
for
(
i
=
1
;
i
<
s
->
active_tile_cols
;
i
++
)
for
(
i
=
1
;
i
<
s
->
active_tile_cols
;
i
++
)
vp9_tile_data_free
(
&
s
->
td
[
i
]);
vp9_tile_data_free
(
&
s
->
td
[
i
]);
...
@@ -341,6 +349,12 @@ static int update_block_buffers(AVCodecContext *avctx)
...
@@ -341,6 +349,12 @@ static int update_block_buffers(AVCodecContext *avctx)
s
->
td
[
i
].
eob_base
=
(
uint8_t
*
)
(
s
->
td
[
i
].
uvblock_base
[
1
]
+
chroma_blocks
*
bytesperpixel
);
s
->
td
[
i
].
eob_base
=
(
uint8_t
*
)
(
s
->
td
[
i
].
uvblock_base
[
1
]
+
chroma_blocks
*
bytesperpixel
);
s
->
td
[
i
].
uveob_base
[
0
]
=
s
->
td
[
i
].
eob_base
+
16
*
16
;
s
->
td
[
i
].
uveob_base
[
0
]
=
s
->
td
[
i
].
eob_base
+
16
*
16
;
s
->
td
[
i
].
uveob_base
[
1
]
=
s
->
td
[
i
].
uveob_base
[
0
]
+
chroma_eobs
;
s
->
td
[
i
].
uveob_base
[
1
]
=
s
->
td
[
i
].
uveob_base
[
0
]
+
chroma_eobs
;
if
(
avctx
->
export_side_data
&
AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS
)
{
s
->
td
[
i
].
block_structure
=
av_malloc_array
(
s
->
cols
*
s
->
rows
,
sizeof
(
*
td
->
block_structure
));
if
(
!
s
->
td
[
i
].
block_structure
)
return
AVERROR
(
ENOMEM
);
}
}
}
}
}
s
->
block_alloc_using_2pass
=
s
->
s
.
frames
[
CUR_FRAME
].
uses_2pass
;
s
->
block_alloc_using_2pass
=
s
->
s
.
frames
[
CUR_FRAME
].
uses_2pass
;
...
@@ -880,6 +894,7 @@ static int decode_frame_header(AVCodecContext *avctx,
...
@@ -880,6 +894,7 @@ static int decode_frame_header(AVCodecContext *avctx,
}
else
{
}
else
{
memset
(
&
s
->
td
[
i
].
counts
,
0
,
sizeof
(
s
->
td
[
0
].
counts
));
memset
(
&
s
->
td
[
i
].
counts
,
0
,
sizeof
(
s
->
td
[
0
].
counts
));
}
}
s
->
td
[
i
].
nb_block_structure
=
0
;
}
}
/* FIXME is it faster to not copy here, but do it down in the fw updates
/* FIXME is it faster to not copy here, but do it down in the fw updates
...
@@ -1481,6 +1496,58 @@ int loopfilter_proc(AVCodecContext *avctx)
...
@@ -1481,6 +1496,58 @@ int loopfilter_proc(AVCodecContext *avctx)
}
}
#endif
#endif
static
int
vp9_export_enc_params
(
VP9Context
*
s
,
VP9Frame
*
frame
)
{
AVVideoEncParams
*
par
;
unsigned
int
tile
,
nb_blocks
=
0
;
if
(
s
->
s
.
h
.
segmentation
.
enabled
)
{
for
(
tile
=
0
;
tile
<
s
->
active_tile_cols
;
tile
++
)
nb_blocks
+=
s
->
td
[
tile
].
nb_block_structure
;
}
par
=
av_video_enc_params_create_side_data
(
frame
->
tf
.
f
,
AV_VIDEO_ENC_PARAMS_VP9
,
nb_blocks
);
if
(
!
par
)
return
AVERROR
(
ENOMEM
);
par
->
qp
=
s
->
s
.
h
.
yac_qi
;
par
->
delta_qp
[
0
][
0
]
=
s
->
s
.
h
.
ydc_qdelta
;
par
->
delta_qp
[
1
][
0
]
=
s
->
s
.
h
.
uvdc_qdelta
;
par
->
delta_qp
[
2
][
0
]
=
s
->
s
.
h
.
uvdc_qdelta
;
par
->
delta_qp
[
1
][
1
]
=
s
->
s
.
h
.
uvac_qdelta
;
par
->
delta_qp
[
2
][
1
]
=
s
->
s
.
h
.
uvac_qdelta
;
if
(
nb_blocks
)
{
unsigned
int
block
=
0
;
unsigned
int
tile
,
block_tile
;
for
(
tile
=
0
;
tile
<
s
->
active_tile_cols
;
tile
++
)
{
VP9TileData
*
td
=
&
s
->
td
[
tile
];
for
(
block_tile
=
0
;
block_tile
<
td
->
nb_block_structure
;
block_tile
++
)
{
AVVideoBlockParams
*
b
=
av_video_enc_params_block
(
par
,
block
++
);
unsigned
int
row
=
td
->
block_structure
[
block_tile
].
row
;
unsigned
int
col
=
td
->
block_structure
[
block_tile
].
col
;
uint8_t
seg_id
=
frame
->
segmentation_map
[
row
*
8
*
s
->
sb_cols
+
col
];
b
->
src_x
=
col
*
8
;
b
->
src_y
=
row
*
8
;
b
->
w
=
1
<<
(
3
+
td
->
block_structure
[
block_tile
].
block_size_idx_x
);
b
->
h
=
1
<<
(
3
+
td
->
block_structure
[
block_tile
].
block_size_idx_y
);
if
(
s
->
s
.
h
.
segmentation
.
feat
[
seg_id
].
q_enabled
)
{
b
->
delta_qp
=
s
->
s
.
h
.
segmentation
.
feat
[
seg_id
].
q_val
;
if
(
s
->
s
.
h
.
segmentation
.
absolute_vals
)
b
->
delta_qp
-=
par
->
qp
;
}
}
}
}
return
0
;
}
static
int
vp9_decode_frame
(
AVCodecContext
*
avctx
,
void
*
frame
,
static
int
vp9_decode_frame
(
AVCodecContext
*
avctx
,
void
*
frame
,
int
*
got_frame
,
AVPacket
*
pkt
)
int
*
got_frame
,
AVPacket
*
pkt
)
{
{
...
@@ -1689,6 +1756,11 @@ FF_ENABLE_DEPRECATION_WARNINGS
...
@@ -1689,6 +1756,11 @@ FF_ENABLE_DEPRECATION_WARNINGS
s
->
td
->
error_info
=
0
;
s
->
td
->
error_info
=
0
;
return
AVERROR_INVALIDDATA
;
return
AVERROR_INVALIDDATA
;
}
}
if
(
avctx
->
export_side_data
&
AV_CODEC_EXPORT_DATA_VIDEO_ENC_PARAMS
)
{
ret
=
vp9_export_enc_params
(
s
,
&
s
->
s
.
frames
[
CUR_FRAME
]);
if
(
ret
<
0
)
return
ret
;
}
finish:
finish:
// ref frame setup
// ref frame setup
...
...
libavcodec/vp9block.c
View file @
ffae62d9
...
@@ -1290,6 +1290,14 @@ void ff_vp9_decode_block(VP9TileData *td, int row, int col,
...
@@ -1290,6 +1290,14 @@ void ff_vp9_decode_block(VP9TileData *td, int row, int col,
b
->
uvtx
=
b
->
tx
-
((
s
->
ss_h
&&
w4
*
2
==
(
1
<<
b
->
tx
))
||
b
->
uvtx
=
b
->
tx
-
((
s
->
ss_h
&&
w4
*
2
==
(
1
<<
b
->
tx
))
||
(
s
->
ss_v
&&
h4
*
2
==
(
1
<<
b
->
tx
)));
(
s
->
ss_v
&&
h4
*
2
==
(
1
<<
b
->
tx
)));
if
(
td
->
block_structure
)
{
td
->
block_structure
[
td
->
nb_block_structure
].
row
=
row
;
td
->
block_structure
[
td
->
nb_block_structure
].
col
=
col
;
td
->
block_structure
[
td
->
nb_block_structure
].
block_size_idx_x
=
av_log2
(
w4
);
td
->
block_structure
[
td
->
nb_block_structure
].
block_size_idx_y
=
av_log2
(
h4
);
td
->
nb_block_structure
++
;
}
if
(
!
b
->
skip
)
{
if
(
!
b
->
skip
)
{
int
has_coeffs
;
int
has_coeffs
;
...
...
libavcodec/vp9dec.h
View file @
ffae62d9
...
@@ -226,6 +226,13 @@ struct VP9TileData {
...
@@ -226,6 +226,13 @@ struct VP9TileData {
// error message
// error message
int
error_info
;
int
error_info
;
struct
{
unsigned
int
row
:
13
;
unsigned
int
col
:
13
;
unsigned
int
block_size_idx_x
:
2
;
unsigned
int
block_size_idx_y
:
2
;
}
*
block_structure
;
unsigned
int
nb_block_structure
;
};
};
void
ff_vp9_fill_mv
(
VP9TileData
*
td
,
VP56mv
*
mv
,
int
mode
,
int
sb
);
void
ff_vp9_fill_mv
(
VP9TileData
*
td
,
VP56mv
*
mv
,
int
mode
,
int
sb
);
...
...
libavutil/video_enc_params.h
View file @
ffae62d9
...
@@ -27,6 +27,21 @@
...
@@ -27,6 +27,21 @@
enum
AVVideoEncParamsType
{
enum
AVVideoEncParamsType
{
AV_VIDEO_ENC_PARAMS_NONE
=
-
1
,
AV_VIDEO_ENC_PARAMS_NONE
=
-
1
,
/**
* VP9 stores:
* - per-frame base (luma AC) quantizer index, exported as AVVideoEncParams.qp
* - deltas for luma DC, chroma AC and chroma DC, exported in the
* corresponding entries in AVVideoEncParams.delta_qp
* - per-segment delta, exported as for each block as AVVideoBlockParams.delta_qp
*
* To compute the resulting quantizer index for a block:
* - for luma AC, add the base qp and the per-block delta_qp, saturating to
* unsigned 8-bit.
* - for luma DC and chroma AC/DC, add the corresponding
* AVVideoBlockParams.delta_qp to the luma AC index, again saturating to
* unsigned 8-bit.
*/
AV_VIDEO_ENC_PARAMS_VP9
,
};
};
/**
/**
...
...
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