Skip to content

Commit 0ef4569

Browse files
committed
vcomp/lavc: common metadata for some compressions
There are (less common) compressions, that basically takes default parameters so it is not necessary to keep record for them separately. The struct, however, is used as the list of available/supported compressions so now iterating over all UG codecs and including codecs with the predicate !get_ug_to_av_codec(ug_codec). Mostly just refactor, just compression_priority has been changed for those that had 5xx values (J2K, HFYU, FFV1) to `500 + codec_id` - assuming that those should have distinct values but the actual order doesn't matter.
1 parent f59cee5 commit 0ef4569

File tree

1 file changed

+36
-40
lines changed

1 file changed

+36
-40
lines changed

src/video_compress/libavcodec.cpp

Lines changed: 36 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ typedef struct {
175175
function<const char*(bool)> get_prefered_encoder; ///< can be nullptr
176176
double avg_bpp;
177177
void (*set_param)(AVCodecContext *, struct setparam_param *);
178-
int capabilities_priority;
178+
int capabilities_priority; ///< sort order in GUI (?)
179179
} codec_params_t;
180180

181181
static void libavcodec_check_messages(struct state_video_compress_libav *s);
@@ -213,12 +213,6 @@ static map<codec_t, codec_params_t> codec_params = {
213213
setparam_jpeg,
214214
102
215215
}},
216-
{ J2K, codec_params_t{
217-
nullptr,
218-
1.0,
219-
setparam_default,
220-
500
221-
}},
222216
{ VP8, codec_params_t{
223217
nullptr,
224218
0.4,
@@ -236,31 +230,32 @@ static map<codec_t, codec_params_t> codec_params = {
236230
setparam_vp8_vp9,
237231
104
238232
}},
239-
{ HFYU, codec_params_t{
240-
nullptr,
241-
0,
242-
setparam_default,
243-
501
244-
}},
245-
{ FFV1, codec_params_t{
246-
nullptr,
247-
0,
248-
setparam_default,
249-
502
250-
}},
251233
{ AV1, codec_params_t{
252234
[](bool) { return is_arm_mac() ? "libaom-av1" : "libsvtav1"; },
253235
0.1,
254236
setparam_h264_h265_av1,
255237
600
256238
}},
257-
{ PRORES, codec_params_t{
258-
nullptr,
259-
0.5,
260-
setparam_default,
261-
300,
262-
}},
263239
};
240+
codec_params_t
241+
get_codec_params(codec_t ug_codec)
242+
{
243+
auto it = codec_params.find(ug_codec);
244+
if (it != codec_params.end()) {
245+
return it->second;
246+
}
247+
int capabilities_priority = 500 + (int) ug_codec;
248+
double avg_bpp = 0;
249+
if (ug_codec == J2K) {
250+
avg_bpp = 1;
251+
}
252+
if (ug_codec == PRORES) {
253+
avg_bpp = 0.5;
254+
capabilities_priority = 300; // perhaps to be before 5xx ?
255+
}
256+
return codec_params_t{ nullptr, avg_bpp, setparam_default,
257+
capabilities_priority };
258+
}
264259

265260
struct aux_header {
266261
char buf[1024]{};
@@ -441,9 +436,10 @@ void usage(bool full) {
441436
"contained in the stream)\n";
442437
}
443438
col() << "\nSupported codecs:\n";
444-
for (auto && param : codec_params) {
445-
enum AVCodecID avID = get_ug_to_av_codec(param.first);
446-
if (avID == AV_CODEC_ID_NONE) { // old FFMPEG -> codec id is flushed to 0 in compat
439+
for (unsigned i = VC_FIRST; i < VC_END; ++i) {
440+
auto ug_codec = (codec_t) i;
441+
enum AVCodecID avID = get_ug_to_av_codec(ug_codec);
442+
if (avID == AV_CODEC_ID_NONE) { // unhandled or old FFMPEG -> codec id is flushed to 0 in compat
447443
continue;
448444
}
449445
char avail[1024];
@@ -454,7 +450,7 @@ void usage(bool full) {
454450
strcpy(avail, "not available");
455451
}
456452
get_codec_details(avID, avail + strlen(avail), sizeof avail - strlen(avail));
457-
col() << "\t" << SBOLD(get_codec_name(param.first)) << " - " << avail << "\n";
453+
col() << "\t" << SBOLD(get_codec_name(ug_codec)) << " - " << avail << "\n";
458454

459455
}
460456
col() << "\nUse '" << SBOLD("-c lavc:enc=<enc>:help")
@@ -662,9 +658,10 @@ static compress_module_info get_libavcodec_module_info(){
662658
"",
663659
"lavc_opt", ":", false});
664660

665-
for (const auto& param : codec_params) {
666-
enum AVCodecID avID = get_ug_to_av_codec(param.first);
667-
if (avID == AV_CODEC_ID_NONE) { // old FFMPEG -> codec id is flushed to 0 in compat
661+
for (unsigned c = VC_FIRST; c < VC_END; ++c) {
662+
auto ug_codec = (codec_t) c;
663+
enum AVCodecID avID = get_ug_to_av_codec(ug_codec);
664+
if (avID == AV_CODEC_ID_NONE) { // unhandled or old FFMPEG -> codec id is flushed to 0 in compat
668665
continue;
669666
}
670667
const AVCodec *i;
@@ -673,8 +670,8 @@ static compress_module_info get_libavcodec_module_info(){
673670
}
674671

675672
codec codec_info;
676-
codec_info.name = get_codec_name(param.first);
677-
codec_info.priority = param.second.capabilities_priority;
673+
codec_info.name = get_codec_name(ug_codec);
674+
codec_info.priority = get_codec_params(ug_codec).capabilities_priority;
678675
codec_info.encoders.emplace_back(
679676
encoder{"default", ":codec=" + codec_info.name});
680677

@@ -904,7 +901,7 @@ bool set_codec_ctx_params(struct state_video_compress_libav *s, AVPixelFormat pi
904901
// average bit per pixel
905902
const double avg_bpp = params.requested_bpp > 0.0
906903
? params.requested_bpp
907-
: codec_params[ug_codec].avg_bpp;
904+
: get_codec_params(ug_codec).avg_bpp;
908905

909906
bool set_bitrate = false;
910907
int_fast64_t bitrate =
@@ -948,7 +945,7 @@ bool set_codec_ctx_params(struct state_video_compress_libav *s, AVPixelFormat pi
948945
s->codec_ctx->pix_fmt = pix_fmt;
949946
s->codec_ctx->bits_per_raw_sample = min<int>(get_bits_per_component(ug_codec), av_pix_fmt_desc_get(pix_fmt)->comp[0].depth);
950947

951-
codec_params[ug_codec].set_param(s->codec_ctx, &params);
948+
get_codec_params(ug_codec).set_param(s->codec_ctx, &params);
952949
set_codec_thread_mode(s->codec_ctx, &params);
953950
s->codec_ctx->slices = IF_NOT_UNDEF_ELSE(
954951
params.slices, s->codec_ctx->codec_id == AV_CODEC_ID_FFV1
@@ -1098,10 +1095,9 @@ const AVCodec *get_av_codec(struct state_video_compress_libav *s, codec_t *ug_co
10981095

10991096
// Else, try to open preferred encoder for requested codec
11001097
const char *preferred_encoder = nullptr;
1101-
if (codec_params.find(*ug_codec) != codec_params.end() &&
1102-
codec_params[*ug_codec].get_prefered_encoder) {
1103-
preferred_encoder = codec_params[*ug_codec].get_prefered_encoder(
1104-
src_rgb);
1098+
if (get_codec_params(*ug_codec).get_prefered_encoder) {
1099+
preferred_encoder =
1100+
get_codec_params(*ug_codec).get_prefered_encoder(src_rgb);
11051101
}
11061102
if (preferred_encoder != nullptr) {
11071103
const AVCodec *codec = avcodec_find_encoder_by_name(preferred_encoder);

0 commit comments

Comments
 (0)