36 #define LINE_DATA_SIZE 9
53 #define OFFSET(x) offsetof(ReadVitcContext, x)
54 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
57 {
"scan_max",
"maximum line numbers to scan for VITC data",
OFFSET(scan_max),
AV_OPT_TYPE_INT, {.i64 = 45 }, -1, INT_MAX,
FLAGS },
68 crc = 0x01 | (
line[0] << 2);
69 crc ^= (
line[0] >> 6) | 0x04 | (
line[1] << 4);
70 crc ^= (
line[1] >> 4) | 0x10 | (
line[2] << 6);
71 crc ^= (
line[2] >> 2) | 0x40;
73 crc ^= 0x01 | (
line[4] << 2);
74 crc ^= (
line[4] >> 6) | 0x04 | (
line[5] << 4);
75 crc ^= (
line[5] >> 4) | 0x10 | (
line[6] << 6);
76 crc ^= (
line[6] >> 2) | 0x40;
79 crc = (crc >> 2) | (crc << 6);
90 int grp_index, pit_index;
95 if (
ctx->scan_max >= 0)
99 for (y = 0; y <
height; y++) {
104 while ((x <
width) && (grp_index < 9)) {
106 while ((x <
width) && (scan_line[x] <
ctx->threshold_white))
108 while ((x <
width) && (scan_line[x] >
ctx->threshold_black))
110 x =
FFMAX(x - ((
ctx->grp_width+10) / 20), 1);
112 if ((grp_start_pos +
ctx->grp_width) >
width)
115 if (pit_value < ctx->threshold_white)
117 x = grp_start_pos + ((
ctx->grp_width) / 10);
119 if (pit_value >
ctx->threshold_black )
121 for (pit_index = 0; pit_index <= 7; pit_index++) {
122 x = grp_start_pos + (((pit_index+2)*
ctx->grp_width) / 10);
124 if (pit_value >
ctx->threshold_gray)
125 ctx->line_data[grp_index] |= (1 << pit_index);
141 if (high > 9 || low > 9)
143 return 10*high + low;
152 unsigned drop = (
line[1] & 0x04);
154 hh, mm,
ss, drop ?
';' :
':', ff);
162 s->threshold_black =
s->thr_b * UINT8_MAX;
163 s->threshold_white =
s->thr_w * UINT8_MAX;
164 if (
s->threshold_black >
s->threshold_white) {
169 s->threshold_gray =
s->threshold_white - ((
s->threshold_white -
s->threshold_black) / 2);
171 s->threshold_black,
s->threshold_white,
s->threshold_gray);
181 s->grp_width = inlink->
w * 5 / 48;
183 inlink->
w, inlink->
h,
s->grp_width,
s->scan_max);
251 .description =
NULL_IF_CONFIG_SMALL(
"Read vertical interval timecode and write it to frame metadata."),
253 .priv_class = &readvitc_class,
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Main libavfilter public API header.
#define ss(width, name, subs,...)
common internal and external API header
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
AVPixelFormat
Pixel format.
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
@ AV_PIX_FMT_YUV440P
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples)
@ AV_PIX_FMT_NV21
as above, but U and V bytes are swapped
@ AV_PIX_FMT_YUV422P
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_GRAY8
Y , 8bpp.
@ AV_PIX_FMT_YUVA420P
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
@ AV_PIX_FMT_YUVJ440P
planar YUV 4:4:0 full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV440P and setting color_range
@ AV_PIX_FMT_YUV410P
planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples)
@ AV_PIX_FMT_YUV411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
@ AV_PIX_FMT_NV16
interleaved chroma YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
@ AV_PIX_FMT_YUV444P
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)
@ AV_PIX_FMT_YUVA444P
planar YUV 4:4:4 32bpp, (1 Cr & Cb sample per 1x1 Y & A samples)
@ AV_PIX_FMT_YUVJ411P
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) full scale (JPEG), deprecated in favor ...
@ AV_PIX_FMT_YUVJ422P
planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV422P and setting col...
@ AV_PIX_FMT_YUVA422P
planar YUV 4:2:2 24bpp, (1 Cr & Cb sample per 2x1 Y & A samples)
@ AV_PIX_FMT_YUVJ444P
planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV444P and setting col...
@ AV_PIX_FMT_YUVJ420P
planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of AV_PIX_FMT_YUV420P and setting col...
Describe the class of an AVClass context structure.
A link between two filters.
int w
agreed upon image width
int h
agreed upon image height
AVFilterContext * dst
dest filter
A filter pad used for either input or output.
const char * name
Pad name.
const char * name
Filter name.
This structure describes decoded (raw) audio or video data.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
AVDictionary * metadata
metadata.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
char tcbuf[AV_TIMECODE_STR_SIZE]
uint8_t line_data[LINE_DATA_SIZE]
#define AV_TIMECODE_STR_SIZE
AVFILTER_DEFINE_CLASS(readvitc)
static int query_formats(AVFilterContext *ctx)
static int read_vitc_line(ReadVitcContext *ctx, uint8_t *src, int line_size, int width, int height)
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
static unsigned bcd2uint(uint8_t high, uint8_t low)
static const AVFilterPad inputs[]
static const AVFilterPad outputs[]
static char * make_vitc_tc_string(char *buf, uint8_t *line)
static int config_props(AVFilterLink *inlink)
static av_cold int init(AVFilterContext *ctx)
static uint8_t get_vitc_crc(uint8_t *line)
static uint8_t get_pit_avg3(uint8_t *line, int i)
static const AVOption readvitc_options[]