| 67 | } |
| 68 | |
| 69 | FFMS_Frame *FFMS_VideoSource::OutputFrame(AVFrame *Frame) { |
| 70 | SanityCheckFrameForData(Frame); |
| 71 | |
| 72 | if (LastFrameWidth != Frame->width || LastFrameHeight != Frame->height || LastFramePixelFormat != Frame->format) { |
| 73 | if (TargetHeight > 0 && TargetWidth > 0 && !TargetPixelFormats.empty()) { |
| 74 | if (!InputFormatOverridden) { |
| 75 | InputFormat = AV_PIX_FMT_NONE; |
| 76 | InputColorSpace = AVCOL_SPC_UNSPECIFIED; |
| 77 | InputColorRange = AVCOL_RANGE_UNSPECIFIED; |
| 78 | } |
| 79 | |
| 80 | ReAdjustOutputFormat(Frame); |
| 81 | } else { |
| 82 | OutputFormat = (AVPixelFormat) Frame->format; |
| 83 | } |
| 84 | } |
| 85 | |
| 86 | if (SWS) { |
| 87 | sws_scale(SWS, Frame->data, Frame->linesize, 0, Frame->height, SWSFrameData, SWSFrameLinesize); |
| 88 | for (int i = 0; i < 4; i++) { |
| 89 | LocalFrame.Data[i] = SWSFrameData[i]; |
| 90 | LocalFrame.Linesize[i] = SWSFrameLinesize[i]; |
| 91 | } |
| 92 | } else { |
| 93 | // Special case to avoid ugly casts |
| 94 | for (int i = 0; i < 4; i++) { |
| 95 | LocalFrame.Data[i] = Frame->data[i]; |
| 96 | LocalFrame.Linesize[i] = Frame->linesize[i]; |
| 97 | } |
| 98 | } |
| 99 | |
| 100 | LocalFrame.EncodedWidth = Frame->width; |
| 101 | LocalFrame.EncodedHeight = Frame->height; |
| 102 | LocalFrame.EncodedPixelFormat = Frame->format; |
| 103 | LocalFrame.ScaledWidth = TargetWidth; |
| 104 | LocalFrame.ScaledHeight = TargetHeight; |
| 105 | LocalFrame.ConvertedPixelFormat = OutputFormat; |
| 106 | LocalFrame.KeyFrame = !!(Frame->flags & AV_FRAME_FLAG_KEY); |
| 107 | LocalFrame.PictType = av_get_picture_type_char(Frame->pict_type); |
| 108 | LocalFrame.RepeatPict = Frame->repeat_pict; |
| 109 | LocalFrame.InterlacedFrame = !!(Frame->flags & AV_FRAME_FLAG_INTERLACED); |
| 110 | LocalFrame.TopFieldFirst = !!(Frame->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST); |
| 111 | LocalFrame.ColorSpace = OutputColorSpaceSet ? OutputColorSpace : Frame->colorspace; |
| 112 | LocalFrame.ColorRange = OutputColorRangeSet ? OutputColorRange : Frame->color_range; |
| 113 | LocalFrame.ColorPrimaries = (OutputColorPrimaries >= 0) ? OutputColorPrimaries : Frame->color_primaries; |
| 114 | LocalFrame.TransferCharateristics = (OutputTransferCharateristics >= 0) ? OutputTransferCharateristics : Frame->color_trc; |
| 115 | LocalFrame.ChromaLocation = (OutputChromaLocation >= 0) ? OutputChromaLocation : Frame->chroma_location; |
| 116 | |
| 117 | const AVFrameSideData *MasteringDisplaySideData = av_frame_get_side_data(Frame, AV_FRAME_DATA_MASTERING_DISPLAY_METADATA); |
| 118 | if (MasteringDisplaySideData) { |
| 119 | const AVMasteringDisplayMetadata *MasteringDisplay = reinterpret_cast<const AVMasteringDisplayMetadata *>(MasteringDisplaySideData->data); |
| 120 | if (MasteringDisplay->has_primaries) { |
| 121 | LocalFrame.HasMasteringDisplayPrimaries = MasteringDisplay->has_primaries; |
| 122 | for (int i = 0; i < 3; i++) { |
| 123 | LocalFrame.MasteringDisplayPrimariesX[i] = av_q2d(MasteringDisplay->display_primaries[i][0]); |
| 124 | LocalFrame.MasteringDisplayPrimariesY[i] = av_q2d(MasteringDisplay->display_primaries[i][1]); |
| 125 | } |
| 126 | LocalFrame.MasteringDisplayWhitePointX = av_q2d(MasteringDisplay->white_point[0]); |
nothing calls this directly
no test coverage detected