+#endif
+
+enum {
+ CHILD_CLASS_ITER_AVIO = 0,
+ CHILD_CLASS_ITER_MUX,
+ CHILD_CLASS_ITER_DEMUX,
+ CHILD_CLASS_ITER_DONE,
+
+};
+
+#define ITER_STATE_SHIFT 16
+
+static const AVClass *format_child_class_iterate(void **iter)
+{
+ // we use the low 16 bits of iter as the value to be passed to
+ // av_(de)muxer_iterate()
+ void *val = (void*)(((uintptr_t)*iter) & ((1 << ITER_STATE_SHIFT) - 1));
+ unsigned int state = ((uintptr_t)*iter) >> ITER_STATE_SHIFT;
+ const AVClass *ret = NULL;
+
+ if (state == CHILD_CLASS_ITER_AVIO) {
+ ret = &ff_avio_class;
+ state++;
+ goto finish;
+ }
+
+ if (state == CHILD_CLASS_ITER_MUX) {
+ const AVOutputFormat *ofmt;
+
+ while ((ofmt = av_muxer_iterate(&val))) {
+ ret = ofmt->priv_class;
+ if (ret)
+ goto finish;
+ }
+
+ val = NULL;
+ state++;
+ }
+
+ if (state == CHILD_CLASS_ITER_DEMUX) {
+ const AVInputFormat *ifmt;
+
+ while ((ifmt = av_demuxer_iterate(&val))) {
+ ret = ifmt->priv_class;
+ if (ret)
+ goto finish;
+ }
+ val = NULL;
+ state++;
+ }
+
+finish:
+ // make sure none av_(de)muxer_iterate does not set the high bits of val
+ av_assert0(!((uintptr_t)val >> ITER_STATE_SHIFT));
+ *iter = (void*)((uintptr_t)val | (state << ITER_STATE_SHIFT));
+ return ret;
+}