static int find_frame_rate_index(MpegEncContext *s){ int i; AVRational bestq= (AVRational){0, 0}; AVRational ext; AVRational target = av_inv_q(s->avctx->time_base); for(i=1;i<14;i++) { if(s->avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL && i>=9) break; for (ext.num=1; ext.num <= 4; ext.num++) { for (ext.den=1; ext.den <= 32; ext.den++) { AVRational q = av_mul_q(ext, ff_mpeg12_frame_rate_tab[i]); if(s->codec_id != AV_CODEC_ID_MPEG2VIDEO && (ext.den!=1 || ext.num!=1)) continue; if(av_gcd(ext.den, ext.num) != 1) continue; if( bestq.num==0 || av_nearer_q(target, bestq, q) < 0 || ext.num==1 && ext.den==1 && av_nearer_q(target, bestq, q) == 0){ bestq = q; s->frame_rate_index= i; s->mpeg2_frame_rate_ext.num = ext.num; s->mpeg2_frame_rate_ext.den = ext.den; } } } } if(av_cmp_q(target, bestq)) return -1; else return 0; }
int av_find_nearest_q_idx(AVRational q, const AVRational* q_list) { int i, nearest_q_idx = 0; for(i=0; q_list[i].den; i++) if (av_nearer_q(q, q_list[i], q_list[nearest_q_idx]) > 0) nearest_q_idx = i; return nearest_q_idx; }