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
ece12db4
Commit
ece12db4
authored
Jul 17, 2016
by
Mark Reid
Committed by
Michael Niedermayer
Jul 23, 2016
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
libavcodec/dnxhdenc: add support for dnxhr encoding
Signed-off-by:
Michael Niedermayer
<
michael@niedermayer.cc
>
parent
cdca1902
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
103 additions
and
19 deletions
+103
-19
dnxhddata.c
libavcodec/dnxhddata.c
+26
-5
dnxhddata.h
libavcodec/dnxhddata.h
+1
-0
dnxhdenc.c
libavcodec/dnxhdenc.c
+71
-14
dnxhdenc.h
libavcodec/dnxhdenc.h
+5
-0
No files found.
libavcodec/dnxhddata.c
View file @
ece12db4
...
...
@@ -1047,35 +1047,35 @@ const CIDEntry ff_dnxhd_cid_table[] = {
dnxhd_1235_dc_codes
,
dnxhd_1235_dc_bits
,
dnxhd_1235_ac_codes
,
dnxhd_1235_ac_bits
,
dnxhd_1235_ac_info
,
dnxhd_1235_run_codes
,
dnxhd_1235_run_bits
,
dnxhd_1235_run
,
{
0
}
},
{
0
}
,
{
{
0
}
},
{
57344
,
255
}
},
{
1271
,
DNXHD_VARIABLE
,
DNXHD_VARIABLE
,
DNXHD_VARIABLE
,
DNXHD_VARIABLE
,
0
,
6
,
DNXHD_VARIABLE
,
4
,
dnxhd_1241_luma_weight
,
dnxhd_1241_chroma_weight
,
dnxhd_1235_dc_codes
,
dnxhd_1235_dc_bits
,
dnxhd_1235_ac_codes
,
dnxhd_1235_ac_bits
,
dnxhd_1235_ac_info
,
dnxhd_1235_run_codes
,
dnxhd_1235_run_bits
,
dnxhd_1235_run
,
{
0
}
},
{
0
}
,
{
{
0
}
},
{
28672
,
255
}
},
{
1272
,
DNXHD_VARIABLE
,
DNXHD_VARIABLE
,
DNXHD_VARIABLE
,
DNXHD_VARIABLE
,
0
,
4
,
8
,
4
,
dnxhd_1238_luma_weight
,
dnxhd_1238_chroma_weight
,
dnxhd_1237_dc_codes
,
dnxhd_1237_dc_bits
,
dnxhd_1238_ac_codes
,
dnxhd_1238_ac_bits
,
dnxhd_1238_ac_info
,
dnxhd_1235_run_codes
,
dnxhd_1235_run_bits
,
dnxhd_1238_run
,
{
0
}
},
{
0
}
,
{
{
0
}
},
{
28672
,
255
}
},
{
1273
,
DNXHD_VARIABLE
,
DNXHD_VARIABLE
,
DNXHD_VARIABLE
,
DNXHD_VARIABLE
,
0
,
4
,
8
,
3
,
dnxhd_1237_luma_weight
,
dnxhd_1237_chroma_weight
,
dnxhd_1237_dc_codes
,
dnxhd_1237_dc_bits
,
dnxhd_1237_ac_codes
,
dnxhd_1237_ac_bits
,
dnxhd_1237_ac_info
,
dnxhd_1237_run_codes
,
dnxhd_1237_run_bits
,
dnxhd_1237_run
,
{
0
}
},
{
0
}
,
{
{
0
}
},
{
18944
,
255
}
},
{
1274
,
DNXHD_VARIABLE
,
DNXHD_VARIABLE
,
DNXHD_VARIABLE
,
DNXHD_VARIABLE
,
0
,
4
,
8
,
3
,
dnxhd_1237_luma_weight
,
dnxhd_1237_chroma_weight
,
dnxhd_1237_dc_codes
,
dnxhd_1237_dc_bits
,
dnxhd_1237_ac_codes
,
dnxhd_1237_ac_bits
,
dnxhd_1237_ac_info
,
dnxhd_1237_run_codes
,
dnxhd_1237_run_bits
,
dnxhd_1237_run
,
{
0
}
},
{
0
}
,
{
{
0
}
},
{
5888
,
255
}
},
};
int
ff_dnxhd_get_cid_table
(
int
cid
)
...
...
@@ -1110,10 +1110,31 @@ uint64_t avpriv_dnxhd_parse_header_prefix(const uint8_t *buf)
return
ff_dnxhd_check_header_prefix
(
prefix
);
}
static
int
dnxhd_find_hr_cid
(
AVCodecContext
*
avctx
)
{
switch
(
avctx
->
profile
)
{
case
FF_PROFILE_DNXHR_444
:
return
1270
;
case
FF_PROFILE_DNXHR_HQX
:
return
1271
;
case
FF_PROFILE_DNXHR_HQ
:
return
1272
;
case
FF_PROFILE_DNXHR_SQ
:
return
1273
;
case
FF_PROFILE_DNXHR_LB
:
return
1274
;
}
return
0
;
}
int
ff_dnxhd_find_cid
(
AVCodecContext
*
avctx
,
int
bit_depth
)
{
int
i
,
j
;
int
mbs
=
avctx
->
bit_rate
/
1000000
;
if
(
avctx
->
profile
!=
FF_PROFILE_DNXHD
)
return
dnxhd_find_hr_cid
(
avctx
);
if
(
!
mbs
)
return
0
;
for
(
i
=
0
;
i
<
FF_ARRAY_ELEMS
(
ff_dnxhd_cid_table
);
i
++
)
{
...
...
libavcodec/dnxhddata.h
View file @
ece12db4
...
...
@@ -55,6 +55,7 @@ typedef struct CIDEntry {
const
uint8_t
*
run_bits
,
*
run
;
int
bit_rates
[
5
];
///< Helper to choose variants, rounded to nearest 5Mb/s
AVRational
frame_rates
[
5
];
AVRational
packet_scale
;
}
CIDEntry
;
extern
const
CIDEntry
ff_dnxhd_cid_table
[];
...
...
libavcodec/dnxhdenc.c
View file @
ece12db4
...
...
@@ -49,6 +49,21 @@ static const AVOption options[] = {
{
"ibias"
,
"intra quant bias"
,
offsetof
(
DNXHDEncContext
,
intra_quant_bias
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
INT_MIN
,
INT_MAX
,
VE
},
{
"profile"
,
NULL
,
offsetof
(
DNXHDEncContext
,
profile
),
AV_OPT_TYPE_INT
,
{
.
i64
=
FF_PROFILE_DNXHD
},
FF_PROFILE_DNXHD
,
FF_PROFILE_DNXHR_444
,
VE
,
"profile"
},
{
"dnxhd"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{
.
i64
=
FF_PROFILE_DNXHD
},
0
,
0
,
VE
,
"profile"
},
{
"dnxhr_444"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{
.
i64
=
FF_PROFILE_DNXHR_444
},
0
,
0
,
VE
,
"profile"
},
{
"dnxhr_hqx"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{
.
i64
=
FF_PROFILE_DNXHR_HQX
},
0
,
0
,
VE
,
"profile"
},
{
"dnxhr_hq"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{
.
i64
=
FF_PROFILE_DNXHR_HQ
},
0
,
0
,
VE
,
"profile"
},
{
"dnxhr_sq"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{
.
i64
=
FF_PROFILE_DNXHR_SQ
},
0
,
0
,
VE
,
"profile"
},
{
"dnxhr_lb"
,
NULL
,
0
,
AV_OPT_TYPE_CONST
,
{
.
i64
=
FF_PROFILE_DNXHR_LB
},
0
,
0
,
VE
,
"profile"
},
{
NULL
}
};
...
...
@@ -276,8 +291,8 @@ static av_cold int dnxhd_init_rc(DNXHDEncContext *ctx)
if
(
ctx
->
m
.
avctx
->
mb_decision
!=
FF_MB_DECISION_RD
)
FF_ALLOCZ_ARRAY_OR_GOTO
(
ctx
->
m
.
avctx
,
ctx
->
mb_cmp
,
ctx
->
m
.
mb_num
,
sizeof
(
RCCMPEntry
),
fail
);
ctx
->
frame_bits
=
(
ctx
->
c
id_table
->
c
oding_unit_size
-
640
-
4
-
ctx
->
min_padding
)
*
8
;
ctx
->
frame_bits
=
(
ctx
->
coding_unit_size
-
ctx
->
data_offset
-
4
-
ctx
->
min_padding
)
*
8
;
ctx
->
qscale
=
1
;
ctx
->
lambda
=
2
<<
LAMBDA_FRAC_BITS
;
// qscale 2
return
0
;
...
...
@@ -285,6 +300,12 @@ fail:
return
AVERROR
(
ENOMEM
);
}
static
int
dnxhd_get_hr_frame_size
(
const
CIDEntry
*
profile
,
int
mb_num
)
{
int
result
=
mb_num
*
profile
->
packet_scale
.
num
/
profile
->
packet_scale
.
den
;
result
=
(
result
+
2048
)
/
4096
*
4096
;
return
FFMAX
(
result
,
8192
);
}
static
av_cold
int
dnxhd_encode_init
(
AVCodecContext
*
avctx
)
{
DNXHDEncContext
*
ctx
=
avctx
->
priv_data
;
...
...
@@ -303,6 +324,14 @@ static av_cold int dnxhd_encode_init(AVCodecContext *avctx)
return
AVERROR
(
EINVAL
);
}
if
(
ctx
->
profile
==
FF_PROFILE_DNXHR_HQX
||
ctx
->
profile
==
FF_PROFILE_DNXHR_HQX
)
{
avpriv_report_missing_feature
(
avctx
,
"dnxhr_444 or dnxhr_hqx profile"
);
return
AVERROR_PATCHWELCOME
;
}
avctx
->
profile
=
ctx
->
profile
;
ctx
->
cid
=
ff_dnxhd_find_cid
(
avctx
,
bit_depth
);
if
(
!
ctx
->
cid
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
...
...
@@ -312,6 +341,15 @@ static av_cold int dnxhd_encode_init(AVCodecContext *avctx)
}
av_log
(
avctx
,
AV_LOG_DEBUG
,
"cid %d
\n
"
,
ctx
->
cid
);
if
(
ctx
->
cid
>=
1270
&&
ctx
->
cid
<=
1274
)
avctx
->
codec_tag
=
MKTAG
(
'A'
,
'V'
,
'd'
,
'h'
);
if
(
avctx
->
width
<
256
||
avctx
->
height
<
120
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Input dimensions too small, input must be at least 256x120
\n
"
);
return
AVERROR
(
EINVAL
);
}
index
=
ff_dnxhd_get_cid_table
(
ctx
->
cid
);
av_assert0
(
index
>=
0
);
...
...
@@ -355,6 +393,20 @@ static av_cold int dnxhd_encode_init(AVCodecContext *avctx)
ctx
->
m
.
mb_num
=
ctx
->
m
.
mb_height
*
ctx
->
m
.
mb_width
;
if
(
ctx
->
cid_table
->
frame_size
==
DNXHD_VARIABLE
)
{
ctx
->
frame_size
=
dnxhd_get_hr_frame_size
(
ctx
->
cid_table
,
ctx
->
m
.
mb_num
);
ctx
->
coding_unit_size
=
ctx
->
frame_size
;
}
else
{
ctx
->
frame_size
=
ctx
->
cid_table
->
frame_size
;
ctx
->
coding_unit_size
=
ctx
->
cid_table
->
coding_unit_size
;
}
if
(
ctx
->
m
.
mb_height
>
68
)
ctx
->
data_offset
=
0x170
+
(
ctx
->
m
.
mb_height
<<
2
);
else
ctx
->
data_offset
=
0x280
;
#if FF_API_QUANT_BIAS
FF_DISABLE_DEPRECATION_WARNINGS
if
(
avctx
->
intra_quant_bias
!=
FF_DEFAULT_QUANT_BIAS
)
...
...
@@ -415,11 +467,16 @@ fail: // for FF_ALLOCZ_OR_GOTO
static
int
dnxhd_write_header
(
AVCodecContext
*
avctx
,
uint8_t
*
buf
)
{
DNXHDEncContext
*
ctx
=
avctx
->
priv_data
;
static
const
uint8_t
header_prefix
[
5
]
=
{
0x00
,
0x00
,
0x02
,
0x80
,
0x01
};
memset
(
buf
,
0
,
640
);
memset
(
buf
,
0
,
ctx
->
data_offset
);
// * write prefix */
AV_WB16
(
buf
+
0x02
,
ctx
->
data_offset
);
if
(
ctx
->
cid
>=
1270
&&
ctx
->
cid
<=
1274
)
buf
[
4
]
=
0x03
;
else
buf
[
4
]
=
0x01
;
memcpy
(
buf
,
header_prefix
,
5
);
buf
[
5
]
=
ctx
->
interlaced
?
ctx
->
cur_field
+
2
:
0x01
;
buf
[
6
]
=
0x80
;
// crc flag off
buf
[
7
]
=
0xa0
;
// reserved
...
...
@@ -573,7 +630,7 @@ void dnxhd_get_blocks(DNXHDEncContext *ctx, int mb_x, int mb_y)
pdsp
->
get_pixels
(
ctx
->
blocks
[
2
],
ptr_u
,
ctx
->
m
.
uvlinesize
);
pdsp
->
get_pixels
(
ctx
->
blocks
[
3
],
ptr_v
,
ctx
->
m
.
uvlinesize
);
if
(
mb_y
+
1
==
ctx
->
m
.
mb_height
&&
ctx
->
m
.
avctx
->
height
==
108
0
)
{
if
(
mb_y
+
1
==
ctx
->
m
.
mb_height
&&
(
ctx
->
m
.
avctx
->
height
%
16
)
!=
0
)
{
if
(
ctx
->
interlaced
)
{
ctx
->
get_pixels_8x4_sym
(
ctx
->
blocks
[
4
],
ptr_y
+
ctx
->
dct_y_offset
,
...
...
@@ -674,7 +731,7 @@ static int dnxhd_encode_thread(AVCodecContext *avctx, void *arg,
DNXHDEncContext
*
ctx
=
avctx
->
priv_data
;
int
mb_y
=
jobnr
,
mb_x
;
ctx
=
ctx
->
thread
[
threadnr
];
init_put_bits
(
&
ctx
->
m
.
pb
,
(
uint8_t
*
)
arg
+
640
+
ctx
->
slice_offs
[
jobnr
],
init_put_bits
(
&
ctx
->
m
.
pb
,
(
uint8_t
*
)
arg
+
ctx
->
data_offset
+
ctx
->
slice_offs
[
jobnr
],
ctx
->
slice_size
[
jobnr
]);
ctx
->
m
.
last_dc
[
0
]
=
...
...
@@ -740,7 +797,7 @@ static int dnxhd_mb_var_thread(AVCodecContext *avctx, void *arg,
int
sum
;
int
varc
;
if
(
!
partial_last_row
&&
mb_x
*
16
<=
avctx
->
width
-
16
)
{
if
(
!
partial_last_row
&&
mb_x
*
16
<=
avctx
->
width
-
16
&&
(
avctx
->
width
%
16
)
==
0
)
{
sum
=
ctx
->
m
.
mpvencdsp
.
pix_sum
(
pix
,
ctx
->
m
.
linesize
);
varc
=
ctx
->
m
.
mpvencdsp
.
pix_norm1
(
pix
,
ctx
->
m
.
linesize
);
}
else
{
...
...
@@ -1063,7 +1120,7 @@ static int dnxhd_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
int
offset
,
i
,
ret
;
uint8_t
*
buf
;
if
((
ret
=
ff_alloc_packet2
(
avctx
,
pkt
,
ctx
->
cid_table
->
frame_size
,
0
))
<
0
)
if
((
ret
=
ff_alloc_packet2
(
avctx
,
pkt
,
ctx
->
frame_size
,
0
))
<
0
)
return
ret
;
buf
=
pkt
->
data
;
...
...
@@ -1099,16 +1156,16 @@ encode_coding_unit:
avctx
->
execute2
(
avctx
,
dnxhd_encode_thread
,
buf
,
NULL
,
ctx
->
m
.
mb_height
);
av_assert1
(
640
+
offset
+
4
<=
ctx
->
cid_table
->
coding_unit_size
);
memset
(
buf
+
640
+
offset
,
0
,
ctx
->
c
id_table
->
coding_unit_size
-
4
-
offset
-
640
);
av_assert1
(
ctx
->
data_offset
+
offset
+
4
<=
ctx
->
coding_unit_size
);
memset
(
buf
+
ctx
->
data_offset
+
offset
,
0
,
ctx
->
c
oding_unit_size
-
4
-
offset
-
ctx
->
data_offset
);
AV_WB32
(
buf
+
ctx
->
c
id_table
->
c
oding_unit_size
-
4
,
0x600DC0DE
);
// EOF
AV_WB32
(
buf
+
ctx
->
coding_unit_size
-
4
,
0x600DC0DE
);
// EOF
if
(
ctx
->
interlaced
&&
first_field
)
{
first_field
=
0
;
ctx
->
cur_field
^=
1
;
buf
+=
ctx
->
c
id_table
->
c
oding_unit_size
;
buf
+=
ctx
->
coding_unit_size
;
goto
encode_coding_unit
;
}
...
...
libavcodec/dnxhdenc.h
View file @
ece12db4
...
...
@@ -45,6 +45,7 @@ typedef struct DNXHDEncContext {
MpegEncContext
m
;
///< Used for quantization dsp functions
int
cid
;
int
profile
;
const
CIDEntry
*
cid_table
;
uint8_t
*
msip
;
///< Macroblock Scan Indexes Payload
uint32_t
*
slice_size
;
...
...
@@ -58,6 +59,10 @@ typedef struct DNXHDEncContext {
unsigned
dct_uv_offset
;
unsigned
block_width_l2
;
int
frame_size
;
int
coding_unit_size
;
int
data_offset
;
int
interlaced
;
int
cur_field
;
...
...
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