X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Ftimecode.c;h=2e0f4a489b88b7edeb5cebddf70b4eda5f0563c0;hb=a129622390fca8a298c3b121f42b2d15910b9b22;hp=fd996edfadb55afd5468304752f703c365edac1f;hpb=552ec4c9fda480d61bff8447347b08f927f1fca3;p=ffmpeg diff --git a/libavcodec/timecode.c b/libavcodec/timecode.c index fd996edfadb..2e0f4a489b8 100644 --- a/libavcodec/timecode.c +++ b/libavcodec/timecode.c @@ -55,7 +55,7 @@ uint32_t avpriv_framenum_to_smpte_timecode(unsigned frame, int fps, int drop) ( (frame / (fps * 3600) % 24)) % 10; // units of hours } -static int check_timecode_rate(void *avcl, AVRational rate, int drop) +int avpriv_check_timecode_rate(void *avcl, AVRational rate, int drop) { int fps; @@ -64,7 +64,7 @@ static int check_timecode_rate(void *avcl, AVRational rate, int drop) return -1; } fps = (rate.num + rate.den/2) / rate.den; - if (drop && (rate.den != 1001 || fps != 30)) { + if (drop && fps != 30) { av_log(avcl, AV_LOG_ERROR, "Drop frame is only allowed with 30000/1001 FPS\n"); return -2; } @@ -83,14 +83,20 @@ char *avpriv_timecode_to_string(char *buf, const struct ff_timecode *tc, unsigne { int frame_num = tc->start + frame; int fps = (tc->rate.num + tc->rate.den/2) / tc->rate.den; - int ff = frame_num % fps; - int ss = frame_num / fps % 60; - int mm = frame_num / (fps*60) % 60; - int hh = frame_num / (fps*3600) % 24; + int hh, mm, ss, ff, neg = 0; if (tc->drop) frame_num = avpriv_framenum_to_drop_timecode(frame_num); - snprintf(buf, sizeof("hh:mm:ss.ff"), "%02d:%02d:%02d%c%02d", + if (frame_num < 0) { + frame_num = -frame_num; + neg = 1; + } + ff = frame_num % fps; + ss = frame_num / fps % 60; + mm = frame_num / (fps*60) % 60; + hh = frame_num / (fps*3600); + snprintf(buf, 16, "%s%02d:%02d:%02d%c%02d", + neg ? "-" : "", hh, mm, ss, tc->drop ? ';' : ':', ff); return buf; } @@ -108,7 +114,7 @@ int avpriv_init_smpte_timecode(void *avcl, struct ff_timecode *tc) tc->drop = c != ':'; // drop if ';', '.', ... - ret = check_timecode_rate(avcl, tc->rate, tc->drop); + ret = avpriv_check_timecode_rate(avcl, tc->rate, tc->drop); if (ret < 0) return ret;