@@ -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
181181static 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
265260struct aux_header {
266261 char buf[1024 ]{};
@@ -441,9 +436,10 @@ void usage(bool full) {
441436 " contained in the stream)\n " ;
442437 }
443438 col () << " \n Supported 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 () << " \n Use '" << 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 , ¶ms);
948+ get_codec_params ( ug_codec) .set_param (s->codec_ctx , ¶ms);
952949 set_codec_thread_mode (s->codec_ctx , ¶ms);
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