Signed-off-by: Limin Wang <lance.lmwang@gmail.com>tags/n4.4
| @@ -219,8 +219,8 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) | |||||
| YADIFContext *yadif = &s->yadif; | YADIFContext *yadif = &s->yadif; | ||||
| ThreadData *td = arg; | ThreadData *td = arg; | ||||
| int linesize = yadif->cur->linesize[td->plane]; | int linesize = yadif->cur->linesize[td->plane]; | ||||
| int clip_max = (1 << (yadif->csp->comp[td->plane].depth)) - 1; | |||||
| int df = (yadif->csp->comp[td->plane].depth + 7) / 8; | |||||
| int clip_max = (1 << (yadif->depth)) - 1; | |||||
| int df = (yadif->depth + 7) / 8; | |||||
| int refs = linesize / df; | int refs = linesize / df; | ||||
| int slice_start = (td->h * jobnr ) / nb_jobs; | int slice_start = (td->h * jobnr ) / nb_jobs; | ||||
| int slice_end = (td->h * (jobnr+1)) / nb_jobs; | int slice_end = (td->h * (jobnr+1)) / nb_jobs; | ||||
| @@ -267,13 +267,13 @@ static void filter(AVFilterContext *ctx, AVFrame *dstpic, | |||||
| ThreadData td = { .frame = dstpic, .parity = parity, .tff = tff }; | ThreadData td = { .frame = dstpic, .parity = parity, .tff = tff }; | ||||
| int i; | int i; | ||||
| for (i = 0; i < yadif->csp->nb_components; i++) { | |||||
| for (i = 0; i < yadif->nb_components; i++) { | |||||
| int w = dstpic->width; | int w = dstpic->width; | ||||
| int h = dstpic->height; | int h = dstpic->height; | ||||
| if (i == 1 || i == 2) { | if (i == 1 || i == 2) { | ||||
| w = AV_CEIL_RSHIFT(w, yadif->csp->log2_chroma_w); | |||||
| h = AV_CEIL_RSHIFT(h, yadif->csp->log2_chroma_h); | |||||
| w = AV_CEIL_RSHIFT(w, yadif->hsub); | |||||
| h = AV_CEIL_RSHIFT(h, yadif->vsub); | |||||
| } | } | ||||
| td.w = w; | td.w = w; | ||||
| @@ -348,9 +348,8 @@ static int config_props(AVFilterLink *link) | |||||
| return AVERROR(EINVAL); | return AVERROR(EINVAL); | ||||
| } | } | ||||
| yadif->csp = av_pix_fmt_desc_get(link->format); | |||||
| yadif->filter = filter; | yadif->filter = filter; | ||||
| if (yadif->csp->comp[0].depth > 8) { | |||||
| if (yadif->depth > 8) { | |||||
| s->filter_intra = filter_intra_16bit; | s->filter_intra = filter_intra_16bit; | ||||
| s->filter_line = filter_line_c_16bit; | s->filter_line = filter_line_c_16bit; | ||||
| s->filter_edge = filter_edge_16bit; | s->filter_edge = filter_edge_16bit; | ||||
| @@ -192,7 +192,7 @@ static int filter_slice(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs) | |||||
| YADIFContext *s = ctx->priv; | YADIFContext *s = ctx->priv; | ||||
| ThreadData *td = arg; | ThreadData *td = arg; | ||||
| int refs = s->cur->linesize[td->plane]; | int refs = s->cur->linesize[td->plane]; | ||||
| int df = (s->csp->comp[td->plane].depth + 7) / 8; | |||||
| int df = (s->depth + 7) / 8; | |||||
| int pix_3 = 3 * df; | int pix_3 = 3 * df; | ||||
| int slice_start = (td->h * jobnr ) / nb_jobs; | int slice_start = (td->h * jobnr ) / nb_jobs; | ||||
| int slice_end = (td->h * (jobnr+1)) / nb_jobs; | int slice_end = (td->h * (jobnr+1)) / nb_jobs; | ||||
| @@ -233,13 +233,13 @@ static void filter(AVFilterContext *ctx, AVFrame *dstpic, | |||||
| ThreadData td = { .frame = dstpic, .parity = parity, .tff = tff }; | ThreadData td = { .frame = dstpic, .parity = parity, .tff = tff }; | ||||
| int i; | int i; | ||||
| for (i = 0; i < yadif->csp->nb_components; i++) { | |||||
| for (i = 0; i < yadif->nb_components; i++) { | |||||
| int w = dstpic->width; | int w = dstpic->width; | ||||
| int h = dstpic->height; | int h = dstpic->height; | ||||
| if (i == 1 || i == 2) { | if (i == 1 || i == 2) { | ||||
| w = AV_CEIL_RSHIFT(w, yadif->csp->log2_chroma_w); | |||||
| h = AV_CEIL_RSHIFT(h, yadif->csp->log2_chroma_h); | |||||
| w = AV_CEIL_RSHIFT(w, yadif->hsub); | |||||
| h = AV_CEIL_RSHIFT(h, yadif->vsub); | |||||
| } | } | ||||
| @@ -292,6 +292,7 @@ static int config_output(AVFilterLink *outlink) | |||||
| { | { | ||||
| AVFilterContext *ctx = outlink->src; | AVFilterContext *ctx = outlink->src; | ||||
| YADIFContext *s = ctx->priv; | YADIFContext *s = ctx->priv; | ||||
| const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(outlink->format); | |||||
| outlink->time_base.num = ctx->inputs[0]->time_base.num; | outlink->time_base.num = ctx->inputs[0]->time_base.num; | ||||
| outlink->time_base.den = ctx->inputs[0]->time_base.den * 2; | outlink->time_base.den = ctx->inputs[0]->time_base.den * 2; | ||||
| @@ -307,9 +308,12 @@ static int config_output(AVFilterLink *outlink) | |||||
| return AVERROR(EINVAL); | return AVERROR(EINVAL); | ||||
| } | } | ||||
| s->csp = av_pix_fmt_desc_get(outlink->format); | |||||
| s->filter = filter; | s->filter = filter; | ||||
| if (s->csp->comp[0].depth > 8) { | |||||
| s->depth = desc->comp[0].depth; | |||||
| s->nb_components = desc->nb_components; | |||||
| s->hsub = desc->log2_chroma_w; | |||||
| s->vsub = desc->log2_chroma_h; | |||||
| if (s->depth > 8) { | |||||
| s->filter_line = filter_line_c_16bit; | s->filter_line = filter_line_c_16bit; | ||||
| s->filter_edges = filter_edges_16bit; | s->filter_edges = filter_edges_16bit; | ||||
| } else { | } else { | ||||
| @@ -55,7 +55,7 @@ av_cold void ff_bwdif_init_x86(BWDIFContext *bwdif) | |||||
| { | { | ||||
| YADIFContext *yadif = &bwdif->yadif; | YADIFContext *yadif = &bwdif->yadif; | ||||
| int cpu_flags = av_get_cpu_flags(); | int cpu_flags = av_get_cpu_flags(); | ||||
| int bit_depth = (!yadif->csp) ? 8 : yadif->csp->comp[0].depth; | |||||
| int bit_depth = yadif->depth; | |||||
| if (bit_depth <= 8) { | if (bit_depth <= 8) { | ||||
| #if ARCH_X86_32 | #if ARCH_X86_32 | ||||
| @@ -60,8 +60,7 @@ void ff_yadif_filter_line_10bit_ssse3(void *dst, void *prev, void *cur, | |||||
| av_cold void ff_yadif_init_x86(YADIFContext *yadif) | av_cold void ff_yadif_init_x86(YADIFContext *yadif) | ||||
| { | { | ||||
| int cpu_flags = av_get_cpu_flags(); | int cpu_flags = av_get_cpu_flags(); | ||||
| int bit_depth = (!yadif->csp) ? 8 | |||||
| : yadif->csp->comp[0].depth; | |||||
| int bit_depth = yadif->depth; | |||||
| if (bit_depth >= 15) { | if (bit_depth >= 15) { | ||||
| #if ARCH_X86_32 | #if ARCH_X86_32 | ||||
| @@ -72,7 +72,10 @@ typedef struct YADIFContext { | |||||
| void (*filter_edges)(void *dst, void *prev, void *cur, void *next, | void (*filter_edges)(void *dst, void *prev, void *cur, void *next, | ||||
| int w, int prefs, int mrefs, int parity, int mode); | int w, int prefs, int mrefs, int parity, int mode); | ||||
| const AVPixFmtDescriptor *csp; | |||||
| int nb_components; | |||||
| int depth; | |||||
| int hsub; | |||||
| int vsub; | |||||
| int eof; | int eof; | ||||
| uint8_t *temp_line; | uint8_t *temp_line; | ||||
| int temp_line_size; | int temp_line_size; | ||||
| @@ -69,7 +69,7 @@ static int return_frame(AVFilterContext *ctx, int is_second) | |||||
| static int checkstride(YADIFContext *yadif, const AVFrame *a, const AVFrame *b) | static int checkstride(YADIFContext *yadif, const AVFrame *a, const AVFrame *b) | ||||
| { | { | ||||
| int i; | int i; | ||||
| for (i = 0; i < yadif->csp->nb_components; i++) | |||||
| for (i = 0; i < yadif->nb_components; i++) | |||||
| if (a->linesize[i] != b->linesize[i]) | if (a->linesize[i] != b->linesize[i]) | ||||
| return 1; | return 1; | ||||
| return 0; | return 0; | ||||