1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2006 Smartjog S.A.S, Baptiste Coudurier <baptiste.coudurier@gmail.com> 3cabdff1aSopenharmony_ci * Copyright (c) 2011-2012 Smartjog S.A.S, Clément Bœsch <clement.boesch@smartjog.com> 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci/** 23cabdff1aSopenharmony_ci * @file 24cabdff1aSopenharmony_ci * Timecode helpers header 25cabdff1aSopenharmony_ci */ 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#ifndef AVUTIL_TIMECODE_H 28cabdff1aSopenharmony_ci#define AVUTIL_TIMECODE_H 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#include <stdint.h> 31cabdff1aSopenharmony_ci#include "rational.h" 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_ci#define AV_TIMECODE_STR_SIZE 23 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_cienum AVTimecodeFlag { 36cabdff1aSopenharmony_ci AV_TIMECODE_FLAG_DROPFRAME = 1<<0, ///< timecode is drop frame 37cabdff1aSopenharmony_ci AV_TIMECODE_FLAG_24HOURSMAX = 1<<1, ///< timecode wraps after 24 hours 38cabdff1aSopenharmony_ci AV_TIMECODE_FLAG_ALLOWNEGATIVE = 1<<2, ///< negative time values are allowed 39cabdff1aSopenharmony_ci}; 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_citypedef struct { 42cabdff1aSopenharmony_ci int start; ///< timecode frame start (first base frame number) 43cabdff1aSopenharmony_ci uint32_t flags; ///< flags such as drop frame, +24 hours support, ... 44cabdff1aSopenharmony_ci AVRational rate; ///< frame rate in rational form 45cabdff1aSopenharmony_ci unsigned fps; ///< frame per second; must be consistent with the rate field 46cabdff1aSopenharmony_ci} AVTimecode; 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ci/** 49cabdff1aSopenharmony_ci * Adjust frame number for NTSC drop frame time code. 50cabdff1aSopenharmony_ci * 51cabdff1aSopenharmony_ci * @param framenum frame number to adjust 52cabdff1aSopenharmony_ci * @param fps frame per second, multiples of 30 53cabdff1aSopenharmony_ci * @return adjusted frame number 54cabdff1aSopenharmony_ci * @warning adjustment is only valid for multiples of NTSC 29.97 55cabdff1aSopenharmony_ci */ 56cabdff1aSopenharmony_ciint av_timecode_adjust_ntsc_framenum2(int framenum, int fps); 57cabdff1aSopenharmony_ci 58cabdff1aSopenharmony_ci/** 59cabdff1aSopenharmony_ci * Convert frame number to SMPTE 12M binary representation. 60cabdff1aSopenharmony_ci * 61cabdff1aSopenharmony_ci * @param tc timecode data correctly initialized 62cabdff1aSopenharmony_ci * @param framenum frame number 63cabdff1aSopenharmony_ci * @return the SMPTE binary representation 64cabdff1aSopenharmony_ci * 65cabdff1aSopenharmony_ci * See SMPTE ST 314M-2005 Sec 4.4.2.2.1 "Time code pack (TC)" 66cabdff1aSopenharmony_ci * the format description as follows: 67cabdff1aSopenharmony_ci * bits 0-5: hours, in BCD(6bits) 68cabdff1aSopenharmony_ci * bits 6: BGF1 69cabdff1aSopenharmony_ci * bits 7: BGF2 (NTSC) or FIELD (PAL) 70cabdff1aSopenharmony_ci * bits 8-14: minutes, in BCD(7bits) 71cabdff1aSopenharmony_ci * bits 15: BGF0 (NTSC) or BGF2 (PAL) 72cabdff1aSopenharmony_ci * bits 16-22: seconds, in BCD(7bits) 73cabdff1aSopenharmony_ci * bits 23: FIELD (NTSC) or BGF0 (PAL) 74cabdff1aSopenharmony_ci * bits 24-29: frames, in BCD(6bits) 75cabdff1aSopenharmony_ci * bits 30: drop frame flag (0: non drop, 1: drop) 76cabdff1aSopenharmony_ci * bits 31: color frame flag (0: unsync mode, 1: sync mode) 77cabdff1aSopenharmony_ci * @note BCD numbers (6 or 7 bits): 4 or 5 lower bits for units, 2 higher bits for tens. 78cabdff1aSopenharmony_ci * @note Frame number adjustment is automatically done in case of drop timecode, 79cabdff1aSopenharmony_ci * you do NOT have to call av_timecode_adjust_ntsc_framenum2(). 80cabdff1aSopenharmony_ci * @note The frame number is relative to tc->start. 81cabdff1aSopenharmony_ci * @note Color frame (CF) and binary group flags (BGF) bits are set to zero. 82cabdff1aSopenharmony_ci */ 83cabdff1aSopenharmony_ciuint32_t av_timecode_get_smpte_from_framenum(const AVTimecode *tc, int framenum); 84cabdff1aSopenharmony_ci 85cabdff1aSopenharmony_ci/** 86cabdff1aSopenharmony_ci * Convert sei info to SMPTE 12M binary representation. 87cabdff1aSopenharmony_ci * 88cabdff1aSopenharmony_ci * @param rate frame rate in rational form 89cabdff1aSopenharmony_ci * @param drop drop flag 90cabdff1aSopenharmony_ci * @param hh hour 91cabdff1aSopenharmony_ci * @param mm minute 92cabdff1aSopenharmony_ci * @param ss second 93cabdff1aSopenharmony_ci * @param ff frame number 94cabdff1aSopenharmony_ci * @return the SMPTE binary representation 95cabdff1aSopenharmony_ci */ 96cabdff1aSopenharmony_ciuint32_t av_timecode_get_smpte(AVRational rate, int drop, int hh, int mm, int ss, int ff); 97cabdff1aSopenharmony_ci 98cabdff1aSopenharmony_ci/** 99cabdff1aSopenharmony_ci * Load timecode string in buf. 100cabdff1aSopenharmony_ci * 101cabdff1aSopenharmony_ci * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long 102cabdff1aSopenharmony_ci * @param tc timecode data correctly initialized 103cabdff1aSopenharmony_ci * @param framenum frame number 104cabdff1aSopenharmony_ci * @return the buf parameter 105cabdff1aSopenharmony_ci * 106cabdff1aSopenharmony_ci * @note Timecode representation can be a negative timecode and have more than 107cabdff1aSopenharmony_ci * 24 hours, but will only be honored if the flags are correctly set. 108cabdff1aSopenharmony_ci * @note The frame number is relative to tc->start. 109cabdff1aSopenharmony_ci */ 110cabdff1aSopenharmony_cichar *av_timecode_make_string(const AVTimecode *tc, char *buf, int framenum); 111cabdff1aSopenharmony_ci 112cabdff1aSopenharmony_ci/** 113cabdff1aSopenharmony_ci * Get the timecode string from the SMPTE timecode format. 114cabdff1aSopenharmony_ci * 115cabdff1aSopenharmony_ci * In contrast to av_timecode_make_smpte_tc_string this function supports 50/60 116cabdff1aSopenharmony_ci * fps timecodes by using the field bit. 117cabdff1aSopenharmony_ci * 118cabdff1aSopenharmony_ci * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long 119cabdff1aSopenharmony_ci * @param rate frame rate of the timecode 120cabdff1aSopenharmony_ci * @param tcsmpte the 32-bit SMPTE timecode 121cabdff1aSopenharmony_ci * @param prevent_df prevent the use of a drop flag when it is known the DF bit 122cabdff1aSopenharmony_ci * is arbitrary 123cabdff1aSopenharmony_ci * @param skip_field prevent the use of a field flag when it is known the field 124cabdff1aSopenharmony_ci * bit is arbitrary (e.g. because it is used as PC flag) 125cabdff1aSopenharmony_ci * @return the buf parameter 126cabdff1aSopenharmony_ci */ 127cabdff1aSopenharmony_cichar *av_timecode_make_smpte_tc_string2(char *buf, AVRational rate, uint32_t tcsmpte, int prevent_df, int skip_field); 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_ci/** 130cabdff1aSopenharmony_ci * Get the timecode string from the SMPTE timecode format. 131cabdff1aSopenharmony_ci * 132cabdff1aSopenharmony_ci * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long 133cabdff1aSopenharmony_ci * @param tcsmpte the 32-bit SMPTE timecode 134cabdff1aSopenharmony_ci * @param prevent_df prevent the use of a drop flag when it is known the DF bit 135cabdff1aSopenharmony_ci * is arbitrary 136cabdff1aSopenharmony_ci * @return the buf parameter 137cabdff1aSopenharmony_ci */ 138cabdff1aSopenharmony_cichar *av_timecode_make_smpte_tc_string(char *buf, uint32_t tcsmpte, int prevent_df); 139cabdff1aSopenharmony_ci 140cabdff1aSopenharmony_ci/** 141cabdff1aSopenharmony_ci * Get the timecode string from the 25-bit timecode format (MPEG GOP format). 142cabdff1aSopenharmony_ci * 143cabdff1aSopenharmony_ci * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long 144cabdff1aSopenharmony_ci * @param tc25bit the 25-bits timecode 145cabdff1aSopenharmony_ci * @return the buf parameter 146cabdff1aSopenharmony_ci */ 147cabdff1aSopenharmony_cichar *av_timecode_make_mpeg_tc_string(char *buf, uint32_t tc25bit); 148cabdff1aSopenharmony_ci 149cabdff1aSopenharmony_ci/** 150cabdff1aSopenharmony_ci * Init a timecode struct with the passed parameters. 151cabdff1aSopenharmony_ci * 152cabdff1aSopenharmony_ci * @param log_ctx a pointer to an arbitrary struct of which the first field 153cabdff1aSopenharmony_ci * is a pointer to an AVClass struct (used for av_log) 154cabdff1aSopenharmony_ci * @param tc pointer to an allocated AVTimecode 155cabdff1aSopenharmony_ci * @param rate frame rate in rational form 156cabdff1aSopenharmony_ci * @param flags miscellaneous flags such as drop frame, +24 hours, ... 157cabdff1aSopenharmony_ci * (see AVTimecodeFlag) 158cabdff1aSopenharmony_ci * @param frame_start the first frame number 159cabdff1aSopenharmony_ci * @return 0 on success, AVERROR otherwise 160cabdff1aSopenharmony_ci */ 161cabdff1aSopenharmony_ciint av_timecode_init(AVTimecode *tc, AVRational rate, int flags, int frame_start, void *log_ctx); 162cabdff1aSopenharmony_ci 163cabdff1aSopenharmony_ci/** 164cabdff1aSopenharmony_ci * Init a timecode struct from the passed timecode components. 165cabdff1aSopenharmony_ci * 166cabdff1aSopenharmony_ci * @param log_ctx a pointer to an arbitrary struct of which the first field 167cabdff1aSopenharmony_ci * is a pointer to an AVClass struct (used for av_log) 168cabdff1aSopenharmony_ci * @param tc pointer to an allocated AVTimecode 169cabdff1aSopenharmony_ci * @param rate frame rate in rational form 170cabdff1aSopenharmony_ci * @param flags miscellaneous flags such as drop frame, +24 hours, ... 171cabdff1aSopenharmony_ci * (see AVTimecodeFlag) 172cabdff1aSopenharmony_ci * @param hh hours 173cabdff1aSopenharmony_ci * @param mm minutes 174cabdff1aSopenharmony_ci * @param ss seconds 175cabdff1aSopenharmony_ci * @param ff frames 176cabdff1aSopenharmony_ci * @return 0 on success, AVERROR otherwise 177cabdff1aSopenharmony_ci */ 178cabdff1aSopenharmony_ciint av_timecode_init_from_components(AVTimecode *tc, AVRational rate, int flags, int hh, int mm, int ss, int ff, void *log_ctx); 179cabdff1aSopenharmony_ci 180cabdff1aSopenharmony_ci/** 181cabdff1aSopenharmony_ci * Parse timecode representation (hh:mm:ss[:;.]ff). 182cabdff1aSopenharmony_ci * 183cabdff1aSopenharmony_ci * @param log_ctx a pointer to an arbitrary struct of which the first field is a 184cabdff1aSopenharmony_ci * pointer to an AVClass struct (used for av_log). 185cabdff1aSopenharmony_ci * @param tc pointer to an allocated AVTimecode 186cabdff1aSopenharmony_ci * @param rate frame rate in rational form 187cabdff1aSopenharmony_ci * @param str timecode string which will determine the frame start 188cabdff1aSopenharmony_ci * @return 0 on success, AVERROR otherwise 189cabdff1aSopenharmony_ci */ 190cabdff1aSopenharmony_ciint av_timecode_init_from_string(AVTimecode *tc, AVRational rate, const char *str, void *log_ctx); 191cabdff1aSopenharmony_ci 192cabdff1aSopenharmony_ci/** 193cabdff1aSopenharmony_ci * Check if the timecode feature is available for the given frame rate 194cabdff1aSopenharmony_ci * 195cabdff1aSopenharmony_ci * @return 0 if supported, <0 otherwise 196cabdff1aSopenharmony_ci */ 197cabdff1aSopenharmony_ciint av_timecode_check_frame_rate(AVRational rate); 198cabdff1aSopenharmony_ci 199cabdff1aSopenharmony_ci#endif /* AVUTIL_TIMECODE_H */ 200