diff options
author | Clément Bœsch <clement.boesch@smartjog.com> | 2012-01-31 14:44:27 +0400 |
---|---|---|
committer | Clément Bœsch <ubitux@gmail.com> | 2012-02-02 17:31:17 +0400 |
commit | 11e5d3b9cf5e9f92d683bc4b2a406f2fb4702cb0 (patch) | |
tree | 989702cdd4a946fb1986d15b6dd3fa54c4c81f75 /libavformat/dv.c | |
parent | 77971609dec16882d2df52328db561a2dc3e591e (diff) |
dv: use new public timecode API.
Diffstat (limited to 'libavformat/dv.c')
-rw-r--r-- | libavformat/dv.c | 38 |
1 files changed, 8 insertions, 30 deletions
diff --git a/libavformat/dv.c b/libavformat/dv.c index 52450231db..7e034fb15c 100644 --- a/libavformat/dv.c +++ b/libavformat/dv.c @@ -34,6 +34,7 @@ #include "libavcodec/dvdata.h" #include "libavutil/intreadwrite.h" #include "libavutil/mathematics.h" +#include "libavutil/timecode.h" #include "dv.h" #include "libavutil/avassert.h" @@ -275,42 +276,19 @@ static int dv_extract_video_info(DVDemuxContext *c, uint8_t* frame) return size; } -static int bcd2int(uint8_t bcd) +static int dv_extract_timecode(DVDemuxContext* c, uint8_t* frame, char *tc) { - int low = bcd & 0xf; - int high = bcd >> 4; - if (low > 9 || high > 9) - return -1; - return low + 10*high; -} - -static int dv_extract_timecode(DVDemuxContext* c, uint8_t* frame, char tc[32]) -{ - int hh, mm, ss, ff, drop_frame; const uint8_t *tc_pack; - tc_pack = dv_extract_pack(frame, dv_timecode); - if (!tc_pack) - return 0; - - ff = bcd2int(tc_pack[1] & 0x3f); - ss = bcd2int(tc_pack[2] & 0x7f); - mm = bcd2int(tc_pack[3] & 0x7f); - hh = bcd2int(tc_pack[4] & 0x3f); - drop_frame = tc_pack[1] >> 6 & 0x1; - - if (ff < 0 || ss < 0 || mm < 0 || hh < 0) - return -1; - // For PAL systems, drop frame bit is replaced by an arbitrary // bit so its value should not be considered. Drop frame timecode // is only relevant for NTSC systems. - if(c->sys->ltc_divisor == 25 || c->sys->ltc_divisor == 50) { - drop_frame = 0; - } + int prevent_df = c->sys->ltc_divisor == 25 || c->sys->ltc_divisor == 50; - snprintf(tc, 32, "%02d:%02d:%02d%c%02d", - hh, mm, ss, drop_frame ? ';' : ':', ff); + tc_pack = dv_extract_pack(frame, dv_timecode); + if (!tc_pack) + return 0; + av_timecode_make_smpte_tc_string(tc, AV_RB32(tc_pack + 1), prevent_df); return 1; } @@ -454,7 +432,7 @@ typedef struct RawDVContext { static int dv_read_timecode(AVFormatContext *s) { int ret; - char timecode[32]; + char timecode[AV_TIMECODE_STR_SIZE]; int64_t pos = avio_tell(s->pb); // Read 3 DIF blocks: Header block and 2 Subcode blocks. |