#11244: "threads" default is overridden
-------------------------------------+-------------------------------------
             Reporter:  psilokos     |                     Type:  defect
               Status:  new          |                 Priority:  normal
            Component:               |                  Version:
  undetermined                       |  unspecified
             Keywords:               |               Blocked By:
             Blocking:               |  Reproduced by developer:  0
Analyzed by developer:  0            |
-------------------------------------+-------------------------------------
 Hi,

 When adding an encoder to 'libavcodec/' and passing a defaults dictionary
 in {{{FFCodec.defaults}}} such as:

 {{{
 const FFCodecDefault ff_xxx_defaults[] = {
     { "threads",           "42" },
     { NULL }
 };

 const FFCodec ff_xxx_encoder = {
     // ...
     .defaults         = ff_xxx_defaults
 }
 }}}

 The "threads" default is correctly applied in
 {{{init_context_defaults()}}} in 'libavcodec/options.c':
 {{{
 137     if (codec && codec2->defaults) {
 138         int ret;
 139         const FFCodecDefault *d = codec2->defaults;
 140         while (d->key) {
 141             ret = av_opt_set(s, d->key, d->value, 0);
 142             av_assert0(ret >= 0);
 143             d++;
 144         }
 145     }
 }}}
 {{{
 * thread #1, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1
   * frame #0: 0x0000000101701970
 ffmpeg_g`av_opt_set(obj=0x00007f8675005700, name="threads", val="42",
 search_flags=0) at opt.c:764:62
     frame #1: 0x0000000100e83def
 ffmpeg_g`init_context_defaults(s=0x00007f8675005700,
 codec=0x00000001022821a8) at options.c:141:19
     frame #2: 0x0000000100e83adf
 ffmpeg_g`avcodec_alloc_context3(codec=0x00000001022821a8) at
 options.c:156:9
     frame #3: 0x000000010002428c ffmpeg_g`ost_add(mux=0x00007f8675004680,
 o=0x00007ff7bfefe5d8, type=AVMEDIA_TYPE_VIDEO, ist=0x00007f8675004840,
 ofilter=0x0000000000000000, post=0x0000000000000000) at
 ffmpeg_mux_init.c:1112:24
     frame #4: 0x000000010002389b
 ffmpeg_g`map_auto_video(mux=0x00007f8675004680, o=0x00007ff7bfefe5d8) at
 ffmpeg_mux_init.c:1489:16
     frame #5: 0x0000000100021268
 ffmpeg_g`create_streams(mux=0x00007f8675004680, o=0x00007ff7bfefe5d8) at
 ffmpeg_mux_init.c:1805:19
     frame #6: 0x00000001000208ca ffmpeg_g`of_open(o=0x00007ff7bfefe5d8,
 filename="y.ivf", sch=0x00007f8674705840) at ffmpeg_mux_init.c:3016:11
     frame #7: 0x00000001000340fa ffmpeg_g`open_files(l=0x00007f8674705a00,
 inout="output", sch=0x00007f8674705840, open_file=(ffmpeg_g`of_open at
 ffmpeg_mux_init.c:2942)) at ffmpeg_opt.c:1213:15
     frame #8: 0x0000000100033e07 ffmpeg_g`ffmpeg_parse_options(argc=12,
 argv=0x00007ff7bfeff2a8, sch=0x00007f8674705840) at ffmpeg_opt.c:1260:11
     frame #9: 0x00000001000495a8 ffmpeg_g`main(argc=12,
 argv=0x00007ff7bfeff2a8) at ffmpeg.c:957:11
 }}}

 But is then overridden by {{{avcodec_open2(avctx, codec, options)}}} in
 'libavcodec/avcodec.c':
 {{{
 196     if ((ret = av_opt_set_dict(avctx, options)) < 0)
 }}}

 With options being fed {{{ { "threads", "auto" } }}} a few lines above the
 call to {{{avcodec_open2()}}} by {{{enc_open()}}} in
 'fftools/ffmpeg_enc.c':
 {{{
 317     if (!av_dict_get(ost->encoder_opts, "threads", NULL, 0))
 318         av_dict_set(&ost->encoder_opts, "threads", "auto", 0);
 }}}
 {{{
 * thread #19, name = 'vf#0:0', stop reason = breakpoint 1.1
   * frame #0: 0x0000000101701970
 ffmpeg_g`av_opt_set(obj=0x00007fdfbef05f80, name="threads", val="auto",
 search_flags=0) at opt.c:764:62
     frame #1: 0x0000000101706c48
 ffmpeg_g`av_opt_set_dict2(obj=0x00007fdfbef05f80,
 options=0x00007fdfbef05bf8, search_flags=0) at opt.c:1943:15
     frame #2: 0x0000000101706d0f
 ffmpeg_g`av_opt_set_dict(obj=0x00007fdfbef05f80,
 options=0x00007fdfbef05bf8) at opt.c:1959:12
     frame #3: 0x0000000100813f61
 ffmpeg_g`avcodec_open2(avctx=0x00007fdfbef05f80, codec=0x00000001022821a8,
 options=0x00007fdfbef05bf8) at avcodec.c:198:16
     frame #4: 0x0000000100010e3b
 ffmpeg_g`enc_open(opaque=0x00007fdfbef05b00, frame=0x00007fdfbef06a40) at
 ffmpeg_enc.c:335:16
     frame #5: 0x000000010003d8ea ffmpeg_g`enc_open(sch=0x00007fdfbf904400,
 enc=0x0000600001bf9ae0, frame=0x00007fdfbef06a40) at
 ffmpeg_sched.c:1613:11
     frame #6: 0x000000010003befd
 ffmpeg_g`send_to_enc(sch=0x00007fdfbf904400, enc=0x0000600001bf9ae0,
 frame=0x00007fdfbef06a40) at ffmpeg_sched.c:1733:19
     frame #7: 0x000000010003be9e
 ffmpeg_g`sch_filter_send(sch=0x00007fdfbf904400, fg_idx=0, out_idx=0,
 frame=0x00007fdfbef06a40) at ffmpeg_sched.c:2389:12
     frame #8: 0x000000010001869b
 ffmpeg_g`fg_output_frame(ofp=0x00007fdfbef07280, fgt=0x000070000eaddde0,
 frame=0x00007fdfc3b04080) at ffmpeg_filter.c:2269:15
     frame #9: 0x000000010001b762
 ffmpeg_g`fg_output_step(ofp=0x00007fdfbef07280, fgt=0x000070000eaddde0,
 frame=0x00007fdfc3b04080) at ffmpeg_filter.c:2371:11
     frame #10: 0x000000010001832d
 ffmpeg_g`read_frames(fg=0x00007fdfbef06740, fgt=0x000070000eaddde0,
 frame=0x00007fdfc3b04080) at ffmpeg_filter.c:2432:23
     frame #11: 0x0000000100015221
 ffmpeg_g`filter_thread(arg=0x00007fdfbef06740) at ffmpeg_filter.c:2846:15
     frame #12: 0x000000010003c9b1
 ffmpeg_g`task_wrapper(arg=0x00006000016f8030) at ffmpeg_sched.c:2447:11
     frame #13: 0x00007ff8140cc18b libsystem_pthread.dylib`_pthread_start +
 99
     frame #14: 0x00007ff8140c7ae3 libsystem_pthread.dylib`thread_start +
 15
 }}}

 This should be done **before** applying the defaults in
 {{{FFCodec.defaults}}}, or just not done if these defaults have one for
 "threads" already.
-- 
Ticket URL: <https://trac.ffmpeg.org/ticket/11244>
FFmpeg <https://ffmpeg.org>
FFmpeg issue tracker
_______________________________________________
FFmpeg-trac mailing list
FFmpeg-trac@avcodec.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-trac

To unsubscribe, visit link above, or email
ffmpeg-trac-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to