Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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;
}