Commit 4b365b08 authored by Clément Bœsch's avatar Clément Bœsch Committed by Clément Bœsch

lavu/timecode: add av_timecode_check_frame_rate().

parent 6b3484dc
...@@ -146,6 +146,17 @@ char *av_timecode_make_mpeg_tc_string(char *buf, uint32_t tc25bit) ...@@ -146,6 +146,17 @@ char *av_timecode_make_mpeg_tc_string(char *buf, uint32_t tc25bit)
return buf; return buf;
} }
static int check_fps(int fps)
{
int i;
static const int supported_fps[] = {24, 25, 30, 50, 60};
for (i = 0; i < FF_ARRAY_ELEMS(supported_fps); i++)
if (fps == supported_fps[i])
return 0;
return -1;
}
static int check_timecode(void *log_ctx, AVTimecode *tc) static int check_timecode(void *log_ctx, AVTimecode *tc)
{ {
if (tc->fps <= 0) { if (tc->fps <= 0) {
...@@ -156,18 +167,12 @@ static int check_timecode(void *log_ctx, AVTimecode *tc) ...@@ -156,18 +167,12 @@ static int check_timecode(void *log_ctx, AVTimecode *tc)
av_log(log_ctx, AV_LOG_ERROR, "Drop frame is only allowed with 30000/1001 FPS\n"); av_log(log_ctx, AV_LOG_ERROR, "Drop frame is only allowed with 30000/1001 FPS\n");
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
switch (tc->fps) { if (check_fps(tc->fps) < 0) {
case 24:
case 25:
case 30:
case 50:
case 60: return 0;
default:
av_log(log_ctx, AV_LOG_ERROR, "Timecode frame rate %d/%d not supported\n", av_log(log_ctx, AV_LOG_ERROR, "Timecode frame rate %d/%d not supported\n",
tc->rate.num, tc->rate.den); tc->rate.num, tc->rate.den);
return AVERROR_PATCHWELCOME; return AVERROR_PATCHWELCOME;
} }
return 0;
} }
static int fps_from_frame_rate(AVRational rate) static int fps_from_frame_rate(AVRational rate)
...@@ -177,6 +182,11 @@ static int fps_from_frame_rate(AVRational rate) ...@@ -177,6 +182,11 @@ static int fps_from_frame_rate(AVRational rate)
return (rate.num + rate.den/2) / rate.den; return (rate.num + rate.den/2) / rate.den;
} }
int av_timecode_check_frame_rate(AVRational rate)
{
return check_fps(fps_from_frame_rate(rate));
}
int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start, void *log_ctx) int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start, void *log_ctx)
{ {
memset(tc, 0, sizeof(*tc)); memset(tc, 0, sizeof(*tc));
......
...@@ -140,4 +140,11 @@ int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start ...@@ -140,4 +140,11 @@ int av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start
*/ */
int av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *str, void *log_ctx); int av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *str, void *log_ctx);
/**
* Check if the timecode feature is available for the given frame rate
*
* @return 0 if supported, <0 otherwise
*/
int av_timecode_check_frame_rate(AVRational rate);
#endif /* AVUTIL_TIMECODE_H */ #endif /* AVUTIL_TIMECODE_H */
...@@ -39,8 +39,8 @@ ...@@ -39,8 +39,8 @@
*/ */
#define LIBAVUTIL_VERSION_MAJOR 51 #define LIBAVUTIL_VERSION_MAJOR 51
#define LIBAVUTIL_VERSION_MINOR 66 #define LIBAVUTIL_VERSION_MINOR 67
#define LIBAVUTIL_VERSION_MICRO 101 #define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
LIBAVUTIL_VERSION_MINOR, \ LIBAVUTIL_VERSION_MINOR, \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment