void FFMS_VideoSource::DetectInputFormat() { if (InputFormat == PIX_FMT_NONE) InputFormat = CodecContext->pix_fmt; AVColorRange RangeFromFormat = handle_jpeg(&InputFormat); if (InputColorRange == AVCOL_RANGE_UNSPECIFIED) InputColorRange = RangeFromFormat; if (InputColorRange == AVCOL_RANGE_UNSPECIFIED) InputColorRange = CodecContext->color_range; if (InputColorRange == AVCOL_RANGE_UNSPECIFIED) InputColorRange = AVCOL_RANGE_MPEG; if (InputColorSpace == AVCOL_SPC_UNSPECIFIED) InputColorSpace = CodecContext->colorspace; if (InputColorSpace == AVCOL_SPC_UNSPECIFIED) InputColorSpace = GetAssumedColorSpace(CodecContext->width, CodecContext->height); }
void FFMS_VideoSource::ReAdjustOutputFormat() { if (SWS) { sws_freeContext(SWS); SWS = NULL; } if (InputFormat == PIX_FMT_NONE) InputFormat = CodecContext->pix_fmt; AVColorRange RangeFromFormat = handle_jpeg(&InputFormat); if (InputColorRange == AVCOL_RANGE_UNSPECIFIED) InputColorRange = RangeFromFormat; if (InputColorRange == AVCOL_RANGE_UNSPECIFIED) InputColorRange = CodecContext->color_range; if (InputColorRange == AVCOL_RANGE_UNSPECIFIED) InputColorRange = AVCOL_RANGE_MPEG; if (InputColorSpace == AVCOL_SPC_UNSPECIFIED) InputColorSpace = CodecContext->colorspace; if (InputColorSpace == AVCOL_SPC_UNSPECIFIED) InputColorSpace = GetAssumedColorSpace(CodecContext->width, CodecContext->height); OutputFormat = FindBestPixelFormat(TargetPixelFormats, InputFormat); if (OutputFormat == PIX_FMT_NONE) { ResetOutputFormat(); throw FFMS_Exception(FFMS_ERROR_SCALING, FFMS_ERROR_INVALID_ARGUMENT, "No suitable output format found"); } OutputColorRange = handle_jpeg(&OutputFormat); if (OutputColorRange == AVCOL_RANGE_UNSPECIFIED) OutputColorRange = CodecContext->color_range; if (OutputColorRange == AVCOL_RANGE_UNSPECIFIED) OutputColorRange = InputColorRange; OutputColorSpace = CodecContext->colorspace; if (OutputColorSpace == AVCOL_SPC_UNSPECIFIED) OutputColorSpace = InputColorSpace; if (InputFormat != OutputFormat || TargetWidth != CodecContext->width || TargetHeight != CodecContext->height || InputColorSpace != OutputColorSpace || InputColorRange != OutputColorRange) { SWS = GetSwsContext( CodecContext->width, CodecContext->height, InputFormat, InputColorSpace, InputColorRange, TargetWidth, TargetHeight, OutputFormat, OutputColorSpace, OutputColorRange, GetSWSCPUFlags() | TargetResizer); if (!SWS) { ResetOutputFormat(); throw FFMS_Exception(FFMS_ERROR_SCALING, FFMS_ERROR_INVALID_ARGUMENT, "Failed to allocate SWScale context"); } } avpicture_free(&SWSFrame); avpicture_alloc(&SWSFrame, OutputFormat, TargetWidth, TargetHeight); }
static const VSFrameRef *VS_CC resizeGetframe(int n, int activationReason, void **instanceData, void **frameData, VSFrameContext *frameCtx, VSCore *core, const VSAPI *vsapi) { ResizeData *d = (ResizeData *) * instanceData; if (activationReason == arInitial) { vsapi->requestFrameFilter(n, d->node, frameCtx); } else if (activationReason == arAllFramesReady) { const int rgb_map[] = {2,0,1}; const VSFrameRef *src = vsapi->getFrameFilter(n, d->node, frameCtx); VSFrameRef *dst = vsapi->newVideoFrame(d->vi.format, d->vi.width, d->vi.height, src, core); int w = vsapi->getFrameWidth(src, 0); int h = vsapi->getFrameHeight(src, 0); const VSFormat *fi = vsapi->getFrameFormat(src); int i; const uint8_t *srcp[3]; uint8_t *dstp[3]; int src_stride[3]; int dst_stride[3]; // swcale expect gbr plane order int switchsrc = 0; int switchdst = 0; if (!d->context || d->lsrcformat != fi || d->lsrcw != w || d->lsrch != h) { int srcid = formatIdToPixelFormat(fi->id); if (srcid == PIX_FMT_NONE) { vsapi->setFilterError("Resize: input format not supported", frameCtx); return 0; } if (d->context) sws_freeContext(d->context); d->context = getSwsContext( w, h, srcid, GetAssumedColorSpace(w, h), AVCOL_RANGE_UNSPECIFIED, d->vi.width, d->vi.height, formatIdToPixelFormat(d->vi.format->id), GetAssumedColorSpace(d->vi.width, d->vi.height), AVCOL_RANGE_UNSPECIFIED, d->flags); if (!d->context) { vsapi->setFilterError("Resize: context creation failed", frameCtx); return 0; } d->lsrcformat = fi; d->lsrcw = w; d->lsrch = h; } switchsrc = fi->colorFamily == cmRGB; switchdst = d->vi.format->colorFamily == cmRGB; for (i = 0; i < vsapi->getFrameFormat(src)->numPlanes; i++) { srcp[switchsrc ? rgb_map[i] : i] = (const uint8_t *)vsapi->getReadPtr(src, i); src_stride[switchsrc ? rgb_map[i] : i] = vsapi->getStride(src, i); } for (i = 0; i < d->vi.format->numPlanes; i++) { dstp[switchdst ? rgb_map[i] : i] = (uint8_t *)vsapi->getWritePtr(dst, i); dst_stride[switchdst ? rgb_map[i] : i] = vsapi->getStride(dst, i); } sws_scale(d->context, srcp, src_stride, 0, h, dstp, dst_stride); vsapi->freeFrame(src); return dst; } return 0; }