mxf: move framenum to timecode convert to timecode helpers.

This is based on the original work by Baptiste Coudurier.
pull/2/head
Clément Bœsch 14 years ago committed by Clément Bœsch
parent b7b72963e0
commit 4c3c6e60f9
  1. 18
      libavcodec/timecode.c
  2. 9
      libavcodec/timecode.h
  3. 22
      libavformat/mxfenc.c

@ -37,6 +37,24 @@ int ff_framenum_to_drop_timecode(int frame_num)
return frame_num + 18 * d + 2 * ((m - 2) / 1798); return frame_num + 18 * d + 2 * ((m - 2) / 1798);
} }
uint32_t ff_framenum_to_smtpe_timecode(unsigned frame, int fps, int drop)
{
return (0 << 31) | // color frame flag
(drop << 30) | // drop frame flag
( ((frame % fps) / 10) << 28) | // tens of frames
( ((frame % fps) % 10) << 24) | // units of frames
(0 << 23) | // field phase (NTSC), b0 (PAL)
((((frame / fps) % 60) / 10) << 20) | // tens of seconds
((((frame / fps) % 60) % 10) << 16) | // units of seconds
(0 << 15) | // b0 (NTSC), b2 (PAL)
((((frame / (fps * 60)) % 60) / 10) << 12) | // tens of minutes
((((frame / (fps * 60)) % 60) % 10) << 8) | // units of minutes
(0 << 7) | // b1
(0 << 6) | // b2 (NTSC), field phase (PAL)
((((frame / (fps * 3600) % 24)) / 10) << 4) | // tens of hours
( (frame / (fps * 3600) % 24)) % 10; // units of hours
}
int ff_init_smtpe_timecode(void *avcl, struct ff_timecode *tc) int ff_init_smtpe_timecode(void *avcl, struct ff_timecode *tc)
{ {
int hh, mm, ss, ff, fps; int hh, mm, ss, ff, fps;

@ -51,6 +51,15 @@ struct ff_timecode {
*/ */
int ff_framenum_to_drop_timecode(int frame_num); int ff_framenum_to_drop_timecode(int frame_num);
/**
* @brief Convert frame id (timecode) to SMPTE 12M binary representation
* @param frame Frame number
* @param fps Frame rate
* @param drop Drop flag
* @return The actual binary representation
*/
uint32_t ff_framenum_to_smtpe_timecode(unsigned frame, int fps, int drop);
/** /**
* Parse SMTPE 12M time representation (hh:mm:ss[:;.]ff). str and rate fields * Parse SMTPE 12M time representation (hh:mm:ss[:;.]ff). str and rate fields
* from tc struct must be set. * from tc struct must be set.

@ -37,6 +37,7 @@
#include "libavutil/random_seed.h" #include "libavutil/random_seed.h"
#include "libavcodec/bytestream.h" #include "libavcodec/bytestream.h"
#include "libavcodec/timecode.h"
#include "audiointerleave.h" #include "audiointerleave.h"
#include "avformat.h" #include "avformat.h"
#include "internal.h" #include "internal.h"
@ -1546,24 +1547,6 @@ static int mxf_write_header(AVFormatContext *s)
static const uint8_t system_metadata_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x03,0x01,0x04,0x01,0x01,0x00 }; static const uint8_t system_metadata_pack_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x05,0x01,0x01,0x0D,0x01,0x03,0x01,0x04,0x01,0x01,0x00 };
static const uint8_t system_metadata_package_set_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x43,0x01,0x01,0x0D,0x01,0x03,0x01,0x04,0x01,0x02,0x01 }; static const uint8_t system_metadata_package_set_key[] = { 0x06,0x0E,0x2B,0x34,0x02,0x43,0x01,0x01,0x0D,0x01,0x03,0x01,0x04,0x01,0x02,0x01 };
static uint32_t ff_framenum_to_12m_time_code(unsigned frame, int drop, int fps)
{
return (0 << 31) | // color frame flag
(drop << 30) | // drop frame flag
( ((frame % fps) / 10) << 28) | // tens of frames
( ((frame % fps) % 10) << 24) | // units of frames
(0 << 23) | // field phase (NTSC), b0 (PAL)
((((frame / fps) % 60) / 10) << 20) | // tens of seconds
((((frame / fps) % 60) % 10) << 16) | // units of seconds
(0 << 15) | // b0 (NTSC), b2 (PAL)
((((frame / (fps * 60)) % 60) / 10) << 12) | // tens of minutes
((((frame / (fps * 60)) % 60) % 10) << 8) | // units of minutes
(0 << 7) | // b1
(0 << 6) | // b2 (NTSC), field phase (PAL)
((((frame / (fps * 3600) % 24)) / 10) << 4) | // tens of hours
( (frame / (fps * 3600) % 24)) % 10; // units of hours
}
static void mxf_write_system_item(AVFormatContext *s) static void mxf_write_system_item(AVFormatContext *s)
{ {
MXFContext *mxf = s->priv_data; MXFContext *mxf = s->priv_data;
@ -1592,7 +1575,8 @@ static void mxf_write_system_item(AVFormatContext *s)
avio_wb64(pb, 0); // creation date/time stamp avio_wb64(pb, 0); // creation date/time stamp
avio_w8(pb, 0x81); // SMPTE 12M time code avio_w8(pb, 0x81); // SMPTE 12M time code
time_code = ff_framenum_to_12m_time_code(frame, mxf->timecode_drop_frame, mxf->timecode_base); time_code = ff_framenum_to_smtpe_timecode(frame, mxf->timecode_base,
mxf->timecode_drop_frame);
avio_wb32(pb, time_code); avio_wb32(pb, time_code);
avio_wb32(pb, 0); // binary group data avio_wb32(pb, 0); // binary group data
avio_wb64(pb, 0); avio_wb64(pb, 0);

Loading…
Cancel
Save