void VideoDecoderFFmpegBasePrivate::updateColorDetails(VideoFrame *f) { if (f->format().pixelFormatFFmpeg() == frame->format) { SetColorDetailsByFFmpeg(f, frame, codec_ctx); return; } // hw decoder output frame may have a different format, e.g. gl interop frame may have rgb format for rendering(stored as yuv) const bool rgb_frame = f->format().isRGB(); if (rgb_frame) { //qDebug("rgb output frame (yuv coded)"); f->setColorSpace(f->format().isPlanar() ? ColorSpace_GBR : ColorSpace_RGB); f->setColorRange(ColorRange_Full); return; } // yuv frame. When happens? const bool rgb_coded = (av_pix_fmt_desc_get(codec_ctx->pix_fmt)->flags & AV_PIX_FMT_FLAG_RGB) == AV_PIX_FMT_FLAG_RGB; if (rgb_coded) { if (f->width() >= 1280 && f->height() >= 576) f->setColorSpace(ColorSpace_BT709); else f->setColorSpace(ColorSpace_BT601); f->setColorRange(ColorRange_Limited); } else { SetColorDetailsByFFmpeg(f, frame, codec_ctx); } }
static void video_frame_cksum(AVBPrint *bp, AVFrame *frame) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format); int i, y; uint8_t *data; int linesize[5] = { 0 }; av_bprintf(bp, ", %d x %d", frame->width, frame->height); if (!desc) { av_bprintf(bp, ", unknown"); return; } if (av_image_fill_linesizes(linesize, frame->format, frame->width) < 0) return; av_bprintf(bp, ", %s", desc->name); for (i = 0; linesize[i]; i++) { unsigned cksum = 0; int h = frame->height; if ((i == 1 || i == 2) && desc->nb_components >= 3) h = -((-h) >> desc->log2_chroma_h); data = frame->data[i]; for (y = 0; y < h; y++) { cksum = av_adler32_update(cksum, data, linesize[i]); data += frame->linesize[i]; } av_bprintf(bp, ", 0x%08x", cksum); } }
static enum AVPixelFormat mediacodec_hwaccel_get_format(AVCodecContext *avctx, const enum AVPixelFormat *pix_fmts) { struct decoder_ctx *ctx = avctx->opaque; const enum AVPixelFormat *p = NULL; for (p = pix_fmts; *p != AV_PIX_FMT_NONE; p++) { AVMediaCodecContext *mediacodec_ctx = NULL; const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(*p); if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL)) break; if (*p != AV_PIX_FMT_MEDIACODEC) continue; if (ctx->opaque) { mediacodec_ctx = av_mediacodec_alloc_context(); if (!mediacodec_ctx) { fprintf(stderr, "Failed to allocate hwaccel ctx\n"); continue; } if (av_mediacodec_default_init(avctx, mediacodec_ctx, ctx->opaque) < 0) { fprintf(stderr, "Failed to init hwaccel ctx\n"); av_freep(&mediacodec_ctx); continue; } ctx->use_hwaccel = 1; } break; } return *p; }
AVPixelFormat VideoDecoderFFmpegHWPrivate::getFormat(struct AVCodecContext *p_context, const AVPixelFormat *pi_fmt) { bool can_hwaccel = false; for (size_t i = 0; pi_fmt[i] != QTAV_PIX_FMT_C(NONE); i++) { const AVPixFmtDescriptor *dsc = av_pix_fmt_desc_get(pi_fmt[i]); if (dsc == NULL) continue; bool hwaccel = (dsc->flags & AV_PIX_FMT_FLAG_HWACCEL) != 0; qDebug("available %sware decoder output format %d (%s)", hwaccel ? "hard" : "soft", pi_fmt[i], dsc->name); if (hwaccel) can_hwaccel = true; } if (!can_hwaccel) goto end; for (size_t i = 0; pi_fmt[i] != QTAV_PIX_FMT_C(NONE); i++) { if (vaPixelFormat() != pi_fmt[i]) continue; /* We try to call setup when possible to detect errors when possible (later is too late) */ if (p_context->width > 0 && p_context->height > 0 && !setup(p_context)) { qWarning("acceleration setup failure"); break; } qDebug("Using %s for hardware decoding.", qPrintable(description)); p_context->draw_horiz_band = NULL; //?? return pi_fmt[i]; } close(); end: qWarning("hardware acceleration is not available" ); /* Fallback to default behaviour */ return avcodec_default_get_format(p_context, pi_fmt); }
static int config_input(AVFilterLink *inlink) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); AVFilterContext *ctx = inlink->dst; ATADenoiseContext *s = ctx->priv; int depth; s->nb_planes = desc->nb_components; s->planeheight[1] = s->planeheight[2] = FF_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h); s->planeheight[0] = s->planeheight[3] = inlink->h; s->planewidth[1] = s->planewidth[2] = FF_CEIL_RSHIFT(inlink->w, desc->log2_chroma_w); s->planewidth[0] = s->planewidth[3] = inlink->w; depth = desc->comp[0].depth; if (depth == 8) s->filter_slice = filter_slice8; else s->filter_slice = filter_slice16; s->thra[0] = s->fthra[0] * (1 << depth) - 1; s->thra[1] = s->fthra[1] * (1 << depth) - 1; s->thra[2] = s->fthra[2] * (1 << depth) - 1; s->thrb[0] = s->fthrb[0] * (1 << depth) - 1; s->thrb[1] = s->fthrb[1] * (1 << depth) - 1; s->thrb[2] = s->fthrb[2] * (1 << depth) - 1; return 0; }
static int query_formats(AVFilterContext *ctx) { AVFilterFormats *pix_fmts = NULL; int fmt, ret; for (fmt = 0; av_pix_fmt_desc_get(fmt); fmt++) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt); if (!(desc->flags & AV_PIX_FMT_FLAG_PAL || desc->flags & AV_PIX_FMT_FLAG_HWACCEL || desc->flags & AV_PIX_FMT_FLAG_BITSTREAM) && (ret = ff_add_format(&pix_fmts, fmt)) < 0) return ret; } return ff_set_common_formats(ctx, pix_fmts); }
static int config_input(AVFilterLink *inlink) { AVFilterContext *ctx = inlink->dst; MaskedClampContext *s = ctx->priv; const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); int vsub, hsub; s->nb_planes = av_pix_fmt_count_planes(inlink->format); hsub = desc->log2_chroma_w; vsub = desc->log2_chroma_h; s->height[1] = s->height[2] = AV_CEIL_RSHIFT(inlink->h, vsub); s->height[0] = s->height[3] = inlink->h; s->width[1] = s->width[2] = AV_CEIL_RSHIFT(inlink->w, hsub); s->width[0] = s->width[3] = inlink->w; s->depth = desc->comp[0].depth; if (desc->comp[0].depth == 8) s->maskedclamp = maskedclamp8; else s->maskedclamp = maskedclamp16; return 0; }
void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt); av_assert0(desc); *h_shift = desc->log2_chroma_w; *v_shift = desc->log2_chroma_h; }
static int config_input(AVFilterLink *inlink) { HQDN3DContext *s = inlink->dst->priv; const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); int i; uninit(inlink->dst); s->hsub = desc->log2_chroma_w; s->vsub = desc->log2_chroma_h; s->depth = desc->comp[0].depth_minus1+1; s->line = av_malloc(inlink->w * sizeof(*s->line)); if (!s->line) return AVERROR(ENOMEM); for (i = 0; i < 4; i++) { s->coefs[i] = precalc_coefs(s->strength[i], s->depth); if (!s->coefs[i]) return AVERROR(ENOMEM); } if (ARCH_X86) ff_hqdn3d_init_x86(s); return 0; }
static int config_input(AVFilterLink *inlink) { AVFilterContext *ctx = inlink->dst; RemapContext *s = ctx->priv; const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); s->nb_planes = av_pix_fmt_count_planes(inlink->format); s->nb_components = desc->nb_components; if (desc->comp[0].depth == 8) { if (s->nb_planes > 1 || s->nb_components == 1) { s->remap = remap_planar; } else { s->remap = remap_packed; } } else { if (s->nb_planes > 1 || s->nb_components == 1) { s->remap = remap_planar16; } else { s->remap = remap_packed16; } } s->step = av_get_padded_bits_per_pixel(desc) >> 3; return 0; }
static int query_formats(AVFilterContext *ctx) { AVFilterFormats *formats; enum AVPixelFormat pix_fmt; int ret; /** accept any input pixel format that is not hardware accelerated, not * a bitstream format, and does not have vertically sub-sampled chroma */ if (ctx->inputs[0]) { formats = NULL; for (pix_fmt = 0; pix_fmt < AV_PIX_FMT_NB; pix_fmt++) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt); if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL || desc->flags & AV_PIX_FMT_FLAG_BITSTREAM) && desc->nb_components && !desc->log2_chroma_h && (ret = ff_add_format(&formats, pix_fmt)) < 0) { ff_formats_unref(&formats); return ret; } } ff_formats_ref(formats, &ctx->inputs[0]->out_formats); ff_formats_ref(formats, &ctx->outputs[0]->in_formats); } return 0; }
void ff_llviddsp_init_x86(LLVidDSPContext *c, AVCodecContext *avctx) { int cpu_flags = av_get_cpu_flags(); const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(avctx->pix_fmt); if (EXTERNAL_MMX(cpu_flags)) { c->add_int16 = ff_add_int16_mmx; c->diff_int16 = ff_diff_int16_mmx; } if (EXTERNAL_MMXEXT(cpu_flags) && pix_desc->comp[0].depth_minus1<15) { c->add_hfyu_median_prediction_int16 = ff_add_hfyu_median_prediction_int16_mmxext; c->sub_hfyu_median_prediction_int16 = ff_sub_hfyu_median_prediction_int16_mmxext; } if (EXTERNAL_SSE2(cpu_flags)) { c->add_int16 = ff_add_int16_sse2; c->diff_int16 = ff_diff_int16_sse2; } if (EXTERNAL_SSSE3(cpu_flags)) { c->add_hfyu_left_prediction_int16 = ff_add_hfyu_left_prediction_int16_ssse3; } if (EXTERNAL_SSE4(cpu_flags)) { c->add_hfyu_left_prediction_int16 = ff_add_hfyu_left_prediction_int16_sse4; } }
static av_cold int init_video(AVFilterContext *ctx) { BufferSourceContext *c = ctx->priv; if (!c->pix_fmt_str || !c->w || !c->h || av_q2d(c->time_base) <= 0) { av_log(ctx, AV_LOG_ERROR, "Invalid parameters provided.\n"); return AVERROR(EINVAL); } if ((c->pix_fmt = av_get_pix_fmt(c->pix_fmt_str)) == AV_PIX_FMT_NONE) { char *tail; c->pix_fmt = strtol(c->pix_fmt_str, &tail, 10); if (*tail || c->pix_fmt < 0 || !av_pix_fmt_desc_get(c->pix_fmt)) { av_log(ctx, AV_LOG_ERROR, "Invalid pixel format string '%s'\n", c->pix_fmt_str); return AVERROR(EINVAL); } } if (!(c->fifo = av_fifo_alloc(sizeof(AVFrame*)))) return AVERROR(ENOMEM); av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d pixfmt:%s tb:%d/%d sar:%d/%d\n", c->w, c->h, av_get_pix_fmt_name(c->pix_fmt), c->time_base.num, c->time_base.den, c->pixel_aspect.num, c->pixel_aspect.den); return 0; }
enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodecContext *enc_ctx, AVCodec *codec, enum AVPixelFormat target) { if (codec && codec->pix_fmts) { const enum AVPixelFormat *p = codec->pix_fmts; const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(target); int has_alpha = desc ? desc->nb_components % 2 == 0 : 0; enum AVPixelFormat best= AV_PIX_FMT_NONE; if (enc_ctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) { p = get_compliance_unofficial_pix_fmts(enc_ctx->codec_id, p); } for (; *p != AV_PIX_FMT_NONE; p++) { best= avcodec_find_best_pix_fmt_of_2(best, *p, target, has_alpha, NULL); if (*p == target) break; } if (*p == AV_PIX_FMT_NONE) { if (target != AV_PIX_FMT_NONE) av_log(NULL, AV_LOG_WARNING, "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n", av_get_pix_fmt_name(target), codec->name, av_get_pix_fmt_name(best)); return best; } } return target; }
enum AVPixelFormat CDecD3D11::get_d3d11_format(struct AVCodecContext *s, const enum AVPixelFormat * pix_fmts) { CDecD3D11 *pDec = (CDecD3D11 *)s->opaque; const enum AVPixelFormat *p; for (p = pix_fmts; *p != -1; p++) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(*p); if (!desc || !(desc->flags & AV_PIX_FMT_FLAG_HWACCEL)) break; if (*p == AV_PIX_FMT_D3D11) { HRESULT hr = pDec->ReInitD3D11Decoder(s); if (FAILED(hr)) { pDec->m_bFailHWDecode = TRUE; continue; } else { break; } } } return *p; }
static inline void smv_img_pnt(uint8_t *dst_data[4], uint8_t *src_data[4], const int src_linesizes[4], enum AVPixelFormat pix_fmt, int width, int height, int nlines) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt); int i, planes_nb = 0; if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL) return; for (i = 0; i < desc->nb_components; i++) planes_nb = FFMAX(planes_nb, desc->comp[i].plane + 1); for (i = 0; i < planes_nb; i++) { int h = height; if (i == 1 || i == 2) { h = FF_CEIL_RSHIFT(height, desc->log2_chroma_h); } smv_img_pnt_plane(&dst_data[i], src_data[i], src_linesizes[i], h, nlines); } if (desc->flags & AV_PIX_FMT_FLAG_PAL || desc->flags & AV_PIX_FMT_FLAG_PSEUDOPAL) dst_data[1] = src_data[1]; }
static int config_input(AVFilterLink *inlink) { AVFilterContext *ctx = inlink->dst; NContext *s = ctx->priv; const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); int ret; if ((ret = av_image_fill_linesizes(s->planewidth, inlink->format, inlink->w)) < 0) return ret; s->planeheight[1] = s->planeheight[2] = AV_CEIL_RSHIFT(inlink->h, desc->log2_chroma_h); s->planeheight[0] = s->planeheight[3] = inlink->h; s->nb_planes = av_pix_fmt_count_planes(inlink->format); s->buffer = av_malloc(3 * (s->planewidth[0] + 32)); if (!s->buffer) return AVERROR(ENOMEM); if (!strcmp(ctx->filter->name, "erosion")) s->filter = erosion; else if (!strcmp(ctx->filter->name, "dilation")) s->filter = dilation; else if (!strcmp(ctx->filter->name, "deflate")) s->filter = deflate; else if (!strcmp(ctx->filter->name, "inflate")) s->filter = inflate; return 0; }
int ff_fill_line_with_color(uint8_t *line[4], int pixel_step[4], int w, uint8_t dst_color[4], enum AVPixelFormat pix_fmt, uint8_t rgba_color[4], int *is_packed_rgba, uint8_t rgba_map_ptr[4]) { uint8_t rgba_map[4] = {0}; int i; const AVPixFmtDescriptor *pix_desc = av_pix_fmt_desc_get(pix_fmt); int hsub; av_assert0(pix_desc); hsub = pix_desc->log2_chroma_w; *is_packed_rgba = ff_fill_rgba_map(rgba_map, pix_fmt) >= 0; if (*is_packed_rgba) { pixel_step[0] = (av_get_bits_per_pixel(pix_desc))>>3; for (i = 0; i < 4; i++) dst_color[rgba_map[i]] = rgba_color[i]; line[0] = av_malloc_array(w, pixel_step[0]); if (!line[0]) return AVERROR(ENOMEM); for (i = 0; i < w; i++) memcpy(line[0] + i * pixel_step[0], dst_color, pixel_step[0]); if (rgba_map_ptr) memcpy(rgba_map_ptr, rgba_map, sizeof(rgba_map[0]) * 4); } else {
static int config_output(AVFilterLink *outlink) { AVFilterContext *ctx = outlink->src; ZPContext *s = ctx->priv; int ret; outlink->w = s->w; outlink->h = s->h; outlink->time_base = av_inv_q(s->framerate); outlink->frame_rate = s->framerate; s->desc = av_pix_fmt_desc_get(outlink->format); ret = av_expr_parse(&s->zoom_expr, s->zoom_expr_str, var_names, NULL, NULL, NULL, NULL, 0, ctx); if (ret < 0) return ret; ret = av_expr_parse(&s->x_expr, s->x_expr_str, var_names, NULL, NULL, NULL, NULL, 0, ctx); if (ret < 0) return ret; ret = av_expr_parse(&s->y_expr, s->y_expr_str, var_names, NULL, NULL, NULL, NULL, 0, ctx); if (ret < 0) return ret; return 0; }
static void hScale16To19_c(SwsContext *c, int16_t *_dst, int dstW, const uint8_t *_src, const int16_t *filter, const int32_t *filterPos, int filterSize) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->srcFormat); int i; int32_t *dst = (int32_t *) _dst; const uint16_t *src = (const uint16_t *) _src; int bits = desc->comp[0].depth_minus1; int sh = bits - 4; if((isAnyRGB(c->srcFormat) || c->srcFormat==AV_PIX_FMT_PAL8) && desc->comp[0].depth_minus1<15) sh= 9; for (i = 0; i < dstW; i++) { int j; int srcPos = filterPos[i]; int val = 0; for (j = 0; j < filterSize; j++) { val += src[srcPos + j] * filter[filterSize * i + j]; } // filter=14 bit, input=16 bit, output=30 bit, >> 11 makes 19 bit dst[i] = FFMIN(val >> sh, (1 << 19) - 1); } }
enum AVPixelFormat choose_pixel_fmt(AVStream *st, AVCodec *codec, enum AVPixelFormat target) { if (codec && codec->pix_fmts) { const enum AVPixelFormat *p = codec->pix_fmts; const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(target); int has_alpha = desc ? desc->nb_components % 2 == 0 : 0; enum AVPixelFormat best= AV_PIX_FMT_NONE; const enum AVPixelFormat mjpeg_formats[] = { AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_NONE }; const enum AVPixelFormat ljpeg_formats[] = { AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P, AV_PIX_FMT_BGRA, AV_PIX_FMT_NONE }; if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) { if (st->codec->codec_id == AV_CODEC_ID_MJPEG) { p = mjpeg_formats; } else if (st->codec->codec_id == AV_CODEC_ID_LJPEG) { p =ljpeg_formats; } } for (; *p != AV_PIX_FMT_NONE; p++) { best= avcodec_find_best_pix_fmt_of_2(best, *p, target, has_alpha, NULL); if (*p == target) break; } if (*p == AV_PIX_FMT_NONE) { if (target != AV_PIX_FMT_NONE) LOGW( "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'", av_get_pix_fmt_name(target), codec->name, av_get_pix_fmt_name(best)); return best; } } return target; }
static int qsv_init_surface(AVHWFramesContext *ctx, mfxFrameSurface1 *surf) { const AVPixFmtDescriptor *desc; uint32_t fourcc; desc = av_pix_fmt_desc_get(ctx->sw_format); if (!desc) return AVERROR(EINVAL); fourcc = qsv_fourcc_from_pix_fmt(ctx->sw_format); if (!fourcc) return AVERROR(EINVAL); surf->Info.BitDepthLuma = desc->comp[0].depth; surf->Info.BitDepthChroma = desc->comp[0].depth; surf->Info.Shift = desc->comp[0].depth > 8; if (desc->log2_chroma_w && desc->log2_chroma_h) surf->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV420; else if (desc->log2_chroma_w) surf->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV422; else surf->Info.ChromaFormat = MFX_CHROMAFORMAT_YUV444; surf->Info.FourCC = fourcc; surf->Info.Width = FFALIGN(ctx->width, 16); surf->Info.CropW = ctx->width; surf->Info.Height = FFALIGN(ctx->height, 16); surf->Info.CropH = ctx->height; surf->Info.FrameRateExtN = 25; surf->Info.FrameRateExtD = 1; surf->Info.PicStruct = MFX_PICSTRUCT_PROGRESSIVE; return 0; }
static int filter_frame(AVFilterLink *link, AVFrame *picref) { AVFilterContext *ctx = link->dst; IDETContext *idet = ctx->priv; if (idet->prev) av_frame_free(&idet->prev); idet->prev = idet->cur; idet->cur = idet->next; idet->next = picref; if (!idet->cur) return 0; if (!idet->prev) idet->prev = av_frame_clone(idet->cur); if (!idet->csp) idet->csp = av_pix_fmt_desc_get(link->format); if (idet->csp->comp[0].depth_minus1 / 8 == 1) { idet->filter_line = (ff_idet_filter_func)ff_idet_filter_line_c_16bit; if (ARCH_X86) ff_idet_init_x86(idet, 1); } filter(ctx); return ff_filter_frame(ctx->outputs[0], av_frame_clone(idet->cur)); }
static int config_input_ref(AVFilterLink *inlink) { AVFilterContext *ctx = inlink->dst; LIBVMAFContext *s = ctx->priv; int th; if (ctx->inputs[0]->w != ctx->inputs[1]->w || ctx->inputs[0]->h != ctx->inputs[1]->h) { av_log(ctx, AV_LOG_ERROR, "Width and height of input videos must be same.\n"); return AVERROR(EINVAL); } if (ctx->inputs[0]->format != ctx->inputs[1]->format) { av_log(ctx, AV_LOG_ERROR, "Inputs must be of same pixel format.\n"); return AVERROR(EINVAL); } s->desc = av_pix_fmt_desc_get(inlink->format); s->width = ctx->inputs[0]->w; s->height = ctx->inputs[0]->h; th = pthread_create(&s->vmaf_thread, NULL, call_vmaf, (void *) s); if (th) { av_log(ctx, AV_LOG_ERROR, "Thread creation failed.\n"); return AVERROR(EINVAL); } return 0; }
static int get_aspect_ratio(AVFilterLink *inlink, AVRational *aspect_ratio) { AVFilterContext *ctx = inlink->dst; AspectContext *s = inlink->dst->priv; const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(inlink->format); double var_values[VARS_NB], res; int ret; var_values[VAR_PI] = M_PI; var_values[VAR_PHI] = M_PHI; var_values[VAR_E] = M_E; var_values[VAR_W] = inlink->w; var_values[VAR_H] = inlink->h; var_values[VAR_A] = (double) inlink->w / inlink->h; var_values[VAR_SAR] = inlink->sample_aspect_ratio.num ? (double) inlink->sample_aspect_ratio.num / inlink->sample_aspect_ratio.den : 1; var_values[VAR_DAR] = var_values[VAR_A] * var_values[VAR_SAR]; var_values[VAR_HSUB] = 1 << desc->log2_chroma_w; var_values[VAR_VSUB] = 1 << desc->log2_chroma_h; /* evaluate new aspect ratio*/ if ((ret = av_expr_parse_and_eval(&res, s->ratio_expr, var_names, var_values, NULL, NULL, NULL, NULL, NULL, 0, ctx)) < 0) { av_log(NULL, AV_LOG_ERROR, "Error when evaluating the expression '%s'\n", s->ratio_expr); return ret; } *aspect_ratio = av_d2q(res, INT_MAX); return 0; }
static int write_header(AVFormatContext *s) { VideoMuxData *img = s->priv_data; AVStream *st = s->streams[0]; const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(st->codec->pix_fmt); av_strlcpy(img->path, s->filename, sizeof(img->path)); /* find format */ if (s->oformat->flags & AVFMT_NOFILE) img->is_pipe = 0; else img->is_pipe = 1; if (st->codec->codec_id == AV_CODEC_ID_GIF) { img->muxer = "gif"; } else if (st->codec->codec_id == AV_CODEC_ID_RAWVIDEO) { const char *str = strrchr(img->path, '.'); img->split_planes = str && !av_strcasecmp(str + 1, "y") && s->nb_streams == 1 && desc &&(desc->flags & AV_PIX_FMT_FLAG_PLANAR) && desc->nb_components >= 3; } return 0; }
static int config_props_output(AVFilterLink *outlink) { AVFilterContext *ctx = outlink->src; TransContext *trans = ctx->priv; AVFilterLink *inlink = ctx->inputs[0]; const AVPixFmtDescriptor *desc_out = av_pix_fmt_desc_get(outlink->format); const AVPixFmtDescriptor *desc_in = av_pix_fmt_desc_get(inlink->format); if (trans->dir&4) { av_log(ctx, AV_LOG_WARNING, "dir values greater than 3 are deprecated, use the passthrough option instead\n"); trans->dir &= 3; trans->passthrough = TRANSPOSE_PT_TYPE_LANDSCAPE; } if ((inlink->w >= inlink->h && trans->passthrough == TRANSPOSE_PT_TYPE_LANDSCAPE) || (inlink->w <= inlink->h && trans->passthrough == TRANSPOSE_PT_TYPE_PORTRAIT)) { av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d -> w:%d h:%d (passthrough mode)\n", inlink->w, inlink->h, inlink->w, inlink->h); return 0; } else { trans->passthrough = TRANSPOSE_PT_TYPE_NONE; } trans->hsub = desc_in->log2_chroma_w; trans->vsub = desc_in->log2_chroma_h; av_image_fill_max_pixsteps(trans->pixsteps, NULL, desc_out); outlink->w = inlink->h; outlink->h = inlink->w; if (inlink->sample_aspect_ratio.num) outlink->sample_aspect_ratio = av_div_q((AVRational) { 1, 1 }, inlink->sample_aspect_ratio); else outlink->sample_aspect_ratio = inlink->sample_aspect_ratio; av_log(ctx, AV_LOG_VERBOSE, "w:%d h:%d dir:%d -> w:%d h:%d rotation:%s vflip:%d\n", inlink->w, inlink->h, trans->dir, outlink->w, outlink->h, trans->dir == 1 || trans->dir == 3 ? "clockwise" : "counterclockwise", trans->dir == 0 || trans->dir == 3); return 0; }
static int query_formats(AVFilterContext *ctx) { AVFilterFormats *pix_fmts = NULL; int fmt; for (fmt = 0; av_pix_fmt_desc_get(fmt); fmt++) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(fmt); if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL || desc->flags & AV_PIX_FMT_FLAG_BITSTREAM || (desc->log2_chroma_w != desc->log2_chroma_h && desc->comp[0].plane == desc->comp[1].plane))) ff_add_format(&pix_fmts, fmt); } ff_set_common_formats(ctx, pix_fmts); return 0; }
AVFilterFormats *ff_merge_formats(AVFilterFormats *a, AVFilterFormats *b, enum AVMediaType type) { AVFilterFormats *ret = NULL; int i, j; int alpha1=0, alpha2=0; int chroma1=0, chroma2=0; if (a == b) return a; /* Do not lose chroma or alpha in merging. It happens if both lists have formats with chroma (resp. alpha), but the only formats in common do not have it (e.g. YUV+gray vs. RGB+gray): in that case, the merging would select the gray format, possibly causing a lossy conversion elsewhere in the graph. To avoid that, pretend that there are no common formats to force the insertion of a conversion filter. */ if (type == AVMEDIA_TYPE_VIDEO) for (i = 0; i < a->nb_formats; i++) for (j = 0; j < b->nb_formats; j++) { const AVPixFmtDescriptor *adesc = av_pix_fmt_desc_get(a->formats[i]); const AVPixFmtDescriptor *bdesc = av_pix_fmt_desc_get(b->formats[j]); alpha2 |= adesc->flags & bdesc->flags & AV_PIX_FMT_FLAG_ALPHA; chroma2|= adesc->nb_components > 1 && bdesc->nb_components > 1; if (a->formats[i] == b->formats[j]) { alpha1 |= adesc->flags & AV_PIX_FMT_FLAG_ALPHA; chroma1|= adesc->nb_components > 1; } } // If chroma or alpha can be lost through merging then do not merge if (alpha2 > alpha1 || chroma2 > chroma1) return NULL; MERGE_FORMATS(ret, a, b, formats, nb_formats, AVFilterFormats, fail); return ret; fail: if (ret) { av_freep(&ret->refs); av_freep(&ret->formats); } av_freep(&ret); return NULL; }
static int smvjpeg_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt) { const AVPixFmtDescriptor *desc; SMVJpegDecodeContext *s = avctx->priv_data; AVFrame* mjpeg_data = s->picture[0]; int i, cur_frame = 0, ret = 0; cur_frame = avpkt->pts % s->frames_per_jpeg; /* Are we at the start of a block? */ if (!cur_frame) { av_frame_unref(mjpeg_data); ret = avcodec_decode_video2(s->avctx, mjpeg_data, &s->mjpeg_data_size, avpkt); if (ret < 0) { s->mjpeg_data_size = 0; return ret; } } else if (!s->mjpeg_data_size) return AVERROR(EINVAL); desc = av_pix_fmt_desc_get(s->avctx->pix_fmt); av_assert0(desc); if (mjpeg_data->height % (s->frames_per_jpeg << desc->log2_chroma_h)) { av_log(avctx, AV_LOG_ERROR, "Invalid height\n"); return AVERROR_INVALIDDATA; } /*use the last lot... */ *data_size = s->mjpeg_data_size; avctx->pix_fmt = s->avctx->pix_fmt; /* We shouldn't get here if frames_per_jpeg <= 0 because this was rejected in init */ ret = ff_set_dimensions(avctx, mjpeg_data->width, mjpeg_data->height / s->frames_per_jpeg); if (ret < 0) { av_log(s, AV_LOG_ERROR, "Failed to set dimensions\n"); return ret; } if (*data_size) { s->picture[1]->extended_data = NULL; s->picture[1]->width = avctx->width; s->picture[1]->height = avctx->height; s->picture[1]->format = avctx->pix_fmt; /* ff_init_buffer_info(avctx, &s->picture[1]); */ smv_img_pnt(s->picture[1]->data, mjpeg_data->data, mjpeg_data->linesize, avctx->pix_fmt, avctx->width, avctx->height, cur_frame); for (i = 0; i < AV_NUM_DATA_POINTERS; i++) s->picture[1]->linesize[i] = mjpeg_data->linesize[i]; ret = av_frame_ref(data, s->picture[1]); } return ret; }