1 /* 2 * Copyright (c) 2006 Smartjog S.A.S, Baptiste Coudurier <baptiste.coudurier@gmail.com> 3 * Copyright (c) 2011-2012 Smartjog S.A.S, Clément Bœsch <clement.boesch@smartjog.com> 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21 22 /** 23 * @file 24 * Timecode helpers header 25 */ 26 27 module ffmpeg.libavutil.timecode; 28 29 import ffmpeg.libavutil.rational; 30 31 extern (C): 32 import ffmpeg; @nogc nothrow: 33 34 enum AV_TIMECODE_STR_SIZE = 23; 35 36 enum AVTimecodeFlag 37 { 38 AV_TIMECODE_FLAG_DROPFRAME = 1 << 0, ///< timecode is drop frame 39 AV_TIMECODE_FLAG_24HOURSMAX = 1 << 1, ///< timecode wraps after 24 hours 40 AV_TIMECODE_FLAG_ALLOWNEGATIVE = 1 << 2 ///< negative time values are allowed 41 } 42 43 struct AVTimecode 44 { 45 int start; ///< timecode frame start (first base frame number) 46 uint flags; ///< flags such as drop frame, +24 hours support, ... 47 AVRational rate; ///< frame rate in rational form 48 uint fps; ///< frame per second; must be consistent with the rate field 49 } 50 51 /** 52 * Adjust frame number for NTSC drop frame time code. 53 * 54 * @param framenum frame number to adjust 55 * @param fps frame per second, 30 or 60 56 * @return adjusted frame number 57 * @warning adjustment is only valid in NTSC 29.97 and 59.94 58 */ 59 int av_timecode_adjust_ntsc_framenum2 (int framenum, int fps); 60 61 /** 62 * Convert frame number to SMPTE 12M binary representation. 63 * 64 * @param tc timecode data correctly initialized 65 * @param framenum frame number 66 * @return the SMPTE binary representation 67 * 68 * @note Frame number adjustment is automatically done in case of drop timecode, 69 * you do NOT have to call av_timecode_adjust_ntsc_framenum2(). 70 * @note The frame number is relative to tc->start. 71 * @note Color frame (CF), binary group flags (BGF) and biphase mark polarity 72 * correction (PC) bits are set to zero. 73 */ 74 uint av_timecode_get_smpte_from_framenum (const(AVTimecode)* tc, int framenum); 75 76 /** 77 * Load timecode string in buf. 78 * 79 * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long 80 * @param tc timecode data correctly initialized 81 * @param framenum frame number 82 * @return the buf parameter 83 * 84 * @note Timecode representation can be a negative timecode and have more than 85 * 24 hours, but will only be honored if the flags are correctly set. 86 * @note The frame number is relative to tc->start. 87 */ 88 char* av_timecode_make_string (const(AVTimecode)* tc, char* buf, int framenum); 89 90 /** 91 * Get the timecode string from the SMPTE timecode format. 92 * 93 * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long 94 * @param tcsmpte the 32-bit SMPTE timecode 95 * @param prevent_df prevent the use of a drop flag when it is known the DF bit 96 * is arbitrary 97 * @return the buf parameter 98 */ 99 char* av_timecode_make_smpte_tc_string (char* buf, uint tcsmpte, int prevent_df); 100 101 /** 102 * Get the timecode string from the 25-bit timecode format (MPEG GOP format). 103 * 104 * @param buf destination buffer, must be at least AV_TIMECODE_STR_SIZE long 105 * @param tc25bit the 25-bits timecode 106 * @return the buf parameter 107 */ 108 char* av_timecode_make_mpeg_tc_string (char* buf, uint tc25bit); 109 110 /** 111 * Init a timecode struct with the passed parameters. 112 * 113 * @param log_ctx a pointer to an arbitrary struct of which the first field 114 * is a pointer to an AVClass struct (used for av_log) 115 * @param tc pointer to an allocated AVTimecode 116 * @param rate frame rate in rational form 117 * @param flags miscellaneous flags such as drop frame, +24 hours, ... 118 * (see AVTimecodeFlag) 119 * @param frame_start the first frame number 120 * @return 0 on success, AVERROR otherwise 121 */ 122 int av_timecode_init (AVTimecode* tc, AVRational rate, int flags, int frame_start, void* log_ctx); 123 124 /** 125 * Parse timecode representation (hh:mm:ss[:;.]ff). 126 * 127 * @param log_ctx a pointer to an arbitrary struct of which the first field is a 128 * pointer to an AVClass struct (used for av_log). 129 * @param tc pointer to an allocated AVTimecode 130 * @param rate frame rate in rational form 131 * @param str timecode string which will determine the frame start 132 * @return 0 on success, AVERROR otherwise 133 */ 134 int av_timecode_init_from_string (AVTimecode* tc, AVRational rate, const(char)* str, void* log_ctx); 135 136 /** 137 * Check if the timecode feature is available for the given frame rate 138 * 139 * @return 0 if supported, <0 otherwise 140 */ 141 int av_timecode_check_frame_rate (AVRational rate); 142 143 /* AVUTIL_TIMECODE_H */