annotate ffmpeg/libavcodec/timecode.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * Copyright (C) 2006 Smartjog S.A.S, Baptiste Coudurier <baptiste.coudurier@gmail.com>
yading@10 3 * Copyright (C) 2011 Smartjog S.A.S, Clément Bœsch <clement.boesch@smartjog.com>
yading@10 4 *
yading@10 5 * This file is part of FFmpeg.
yading@10 6 *
yading@10 7 * FFmpeg is free software; you can redistribute it and/or
yading@10 8 * modify it under the terms of the GNU Lesser General Public
yading@10 9 * License as published by the Free Software Foundation; either
yading@10 10 * version 2.1 of the License, or (at your option) any later version.
yading@10 11 *
yading@10 12 * FFmpeg is distributed in the hope that it will be useful,
yading@10 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 15 * Lesser General Public License for more details.
yading@10 16 *
yading@10 17 * You should have received a copy of the GNU Lesser General Public
yading@10 18 * License along with FFmpeg; if not, write to the Free Software
yading@10 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 20 */
yading@10 21
yading@10 22 /**
yading@10 23 * @file
yading@10 24 * Timecode helpers
yading@10 25 * This *private* API is deprecated, please use the one available in libavutil instead.
yading@10 26 */
yading@10 27
yading@10 28 #include "version.h"
yading@10 29
yading@10 30 #if FF_API_OLD_TIMECODE
yading@10 31
yading@10 32 #include <stdio.h>
yading@10 33 #include "timecode.h"
yading@10 34 #include "libavutil/log.h"
yading@10 35
yading@10 36 int avpriv_framenum_to_drop_timecode(int frame_num)
yading@10 37 {
yading@10 38 /* only works for NTSC 29.97 */
yading@10 39 int d = frame_num / 17982;
yading@10 40 int m = frame_num % 17982;
yading@10 41 //if (m < 2) m += 2; /* not needed since -2,-1 / 1798 in C returns 0 */
yading@10 42 return frame_num + 18 * d + 2 * ((m - 2) / 1798);
yading@10 43 }
yading@10 44
yading@10 45 uint32_t avpriv_framenum_to_smpte_timecode(unsigned frame, int fps, int drop)
yading@10 46 {
yading@10 47 return (0 << 31) | // color frame flag
yading@10 48 (drop << 30) | // drop frame flag
yading@10 49 ( ((frame % fps) / 10) << 28) | // tens of frames
yading@10 50 ( ((frame % fps) % 10) << 24) | // units of frames
yading@10 51 (0 << 23) | // field phase (NTSC), b0 (PAL)
yading@10 52 ((((frame / fps) % 60) / 10) << 20) | // tens of seconds
yading@10 53 ((((frame / fps) % 60) % 10) << 16) | // units of seconds
yading@10 54 (0 << 15) | // b0 (NTSC), b2 (PAL)
yading@10 55 ((((frame / (fps * 60)) % 60) / 10) << 12) | // tens of minutes
yading@10 56 ((((frame / (fps * 60)) % 60) % 10) << 8) | // units of minutes
yading@10 57 (0 << 7) | // b1
yading@10 58 (0 << 6) | // b2 (NTSC), field phase (PAL)
yading@10 59 ((((frame / (fps * 3600) % 24)) / 10) << 4) | // tens of hours
yading@10 60 ( (frame / (fps * 3600) % 24)) % 10; // units of hours
yading@10 61 }
yading@10 62
yading@10 63 int avpriv_check_timecode_rate(void *avcl, AVRational rate, int drop)
yading@10 64 {
yading@10 65 int fps;
yading@10 66
yading@10 67 if (!rate.num || !rate.den) {
yading@10 68 av_log(avcl, AV_LOG_ERROR, "Timecode frame rate must be specified\n");
yading@10 69 return -1;
yading@10 70 }
yading@10 71 fps = (rate.num + rate.den/2) / rate.den;
yading@10 72 if (drop && fps != 30) {
yading@10 73 av_log(avcl, AV_LOG_ERROR, "Drop frame is only allowed with 30000/1001 FPS\n");
yading@10 74 return -2;
yading@10 75 }
yading@10 76 switch (fps) {
yading@10 77 case 24:
yading@10 78 case 25:
yading@10 79 case 30: return 0;
yading@10 80
yading@10 81 default:
yading@10 82 av_log(avcl, AV_LOG_ERROR, "Timecode frame rate not supported\n");
yading@10 83 return -3;
yading@10 84 }
yading@10 85 }
yading@10 86
yading@10 87 char *avpriv_timecode_to_string(char *buf, const struct ff_timecode *tc, unsigned frame)
yading@10 88 {
yading@10 89 int frame_num = tc->start + frame;
yading@10 90 int fps = (tc->rate.num + tc->rate.den/2) / tc->rate.den;
yading@10 91 int hh, mm, ss, ff, neg = 0;
yading@10 92
yading@10 93 if (tc->drop)
yading@10 94 frame_num = avpriv_framenum_to_drop_timecode(frame_num);
yading@10 95 if (frame_num < 0) {
yading@10 96 frame_num = -frame_num;
yading@10 97 neg = 1;
yading@10 98 }
yading@10 99 ff = frame_num % fps;
yading@10 100 ss = frame_num / fps % 60;
yading@10 101 mm = frame_num / (fps*60) % 60;
yading@10 102 hh = frame_num / (fps*3600);
yading@10 103 snprintf(buf, 16, "%s%02d:%02d:%02d%c%02d",
yading@10 104 neg ? "-" : "",
yading@10 105 hh, mm, ss, tc->drop ? ';' : ':', ff);
yading@10 106 return buf;
yading@10 107 }
yading@10 108
yading@10 109 int avpriv_init_smpte_timecode(void *avcl, struct ff_timecode *tc)
yading@10 110 {
yading@10 111 int hh, mm, ss, ff, fps, ret;
yading@10 112 char c;
yading@10 113
yading@10 114 if (sscanf(tc->str, "%d:%d:%d%c%d", &hh, &mm, &ss, &c, &ff) != 5) {
yading@10 115 av_log(avcl, AV_LOG_ERROR, "unable to parse timecode, "
yading@10 116 "syntax: hh:mm:ss[:;.]ff\n");
yading@10 117 return -1;
yading@10 118 }
yading@10 119
yading@10 120 tc->drop = c != ':'; // drop if ';', '.', ...
yading@10 121
yading@10 122 ret = avpriv_check_timecode_rate(avcl, tc->rate, tc->drop);
yading@10 123 if (ret < 0)
yading@10 124 return ret;
yading@10 125
yading@10 126 fps = (tc->rate.num + tc->rate.den/2) / tc->rate.den;
yading@10 127 tc->start = (hh*3600 + mm*60 + ss) * fps + ff;
yading@10 128
yading@10 129 if (tc->drop) { /* adjust frame number */
yading@10 130 int tmins = 60*hh + mm;
yading@10 131 tc->start -= 2 * (tmins - tmins/10);
yading@10 132 }
yading@10 133 return 0;
yading@10 134 }
yading@10 135
yading@10 136 int ff_framenum_to_drop_timecode(int frame_num)
yading@10 137 {
yading@10 138 return avpriv_framenum_to_drop_timecode(frame_num);
yading@10 139 }
yading@10 140
yading@10 141 uint32_t ff_framenum_to_smtpe_timecode(unsigned frame, int fps, int drop)
yading@10 142 {
yading@10 143 return avpriv_framenum_to_smpte_timecode(frame, fps, drop);
yading@10 144 }
yading@10 145
yading@10 146 int ff_init_smtpe_timecode(void *avcl, struct ff_timecode *tc)
yading@10 147 {
yading@10 148 return avpriv_init_smpte_timecode(avcl, tc);
yading@10 149 }
yading@10 150 #endif