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