void FFMS_VideoSource::ReAdjustOutputFormat() { if (SWS) { sws_freeContext(SWS); SWS = nullptr; } DetectInputFormat(); OutputFormat = FindBestPixelFormat(TargetPixelFormats, InputFormat); if (OutputFormat == FFMS_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, TargetResizer); if (!SWS) { ResetOutputFormat(); throw FFMS_Exception(FFMS_ERROR_SCALING, FFMS_ERROR_INVALID_ARGUMENT, "Failed to allocate SWScale context"); } } av_freep(&SWSFrameData[0]); if (av_image_alloc(SWSFrameData, SWSFrameLinesize, TargetWidth, TargetHeight, OutputFormat, 4) < 0) throw FFMS_Exception(FFMS_ERROR_SCALING, FFMS_ERROR_ALLOCATION_FAILED, "Could not allocate frame with new resolution."); }
void FFMS_VideoSource::ReAdjustOutputFormat() { if (SWS) { sws_freeContext(SWS); SWS = NULL; } DetectInputFormat(); 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, 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); }
void FFMS_VideoSource::SetVideoProperties() { VP.RFFDenominator = CodecContext->time_base.num; VP.RFFNumerator = CodecContext->time_base.den; if (CodecContext->codec_id == FFMS_ID(H264)) { if (VP.RFFNumerator & 1) VP.RFFDenominator *= 2; else VP.RFFNumerator /= 2; } VP.NumFrames = Frames.VisibleFrameCount(); VP.TopFieldFirst = DecodeFrame->top_field_first; VP.ColorSpace = CodecContext->colorspace; VP.ColorRange = CodecContext->color_range; // these pixfmt's are deprecated but still used if ( CodecContext->pix_fmt == PIX_FMT_YUVJ420P || CodecContext->pix_fmt == PIX_FMT_YUVJ422P || CodecContext->pix_fmt == PIX_FMT_YUVJ444P ) VP.ColorRange = AVCOL_RANGE_JPEG; VP.FirstTime = ((Frames.front().PTS * Frames.TB.Num) / (double)Frames.TB.Den) / 1000; VP.LastTime = ((Frames.back().PTS * Frames.TB.Num) / (double)Frames.TB.Den) / 1000; if (CodecContext->width <= 0 || CodecContext->height <= 0) throw FFMS_Exception(FFMS_ERROR_DECODING, FFMS_ERROR_CODEC, "Codec returned zero size video"); // attempt to correct framerate to the proper NTSC fraction, if applicable CorrectNTSCRationalFramerate(&VP.FPSNumerator, &VP.FPSDenominator); // correct the timebase, if necessary CorrectTimebase(&VP, &Frames.TB); // Set AR variables VP.SARNum = CodecContext->sample_aspect_ratio.num; VP.SARDen = CodecContext->sample_aspect_ratio.den; // Set input and output formats now that we have a CodecContext DetectInputFormat(); OutputFormat = InputFormat; OutputColorSpace = InputColorSpace; OutputColorRange = InputColorRange; }