diff --git a/src/PyNvCodec/src/PyNvCodec.cpp b/src/PyNvCodec/src/PyNvCodec.cpp index 241a7f2b..e55dee99 100644 --- a/src/PyNvCodec/src/PyNvCodec.cpp +++ b/src/PyNvCodec/src/PyNvCodec.cpp @@ -235,6 +235,8 @@ PYBIND11_MODULE(_PyNvCodec, m) .value("YUV422", Pixel_Format::YUV422) .value("P10", Pixel_Format::P10) .value("P12", Pixel_Format::P12) + .value("GRAY12", Pixel_Format::GRAY12) + .value("GRAY16", Pixel_Format::GRAY16) .export_values(); py::enum_(m, "ColorSpace") diff --git a/src/TC/inc/MemoryInterfaces.hpp b/src/TC/inc/MemoryInterfaces.hpp index 0bc1ce19..452aaae9 100644 --- a/src/TC/inc/MemoryInterfaces.hpp +++ b/src/TC/inc/MemoryInterfaces.hpp @@ -46,6 +46,7 @@ enum Pixel_Format { YUV420_10bit = 15, NV12_Planar = 16, GRAY12 = 17, + GRAY16 = 18, }; enum ColorSpace { diff --git a/src/TC/src/FfmpegSwDecoder.cpp b/src/TC/src/FfmpegSwDecoder.cpp index 8b6a3041..2f30b640 100644 --- a/src/TC/src/FfmpegSwDecoder.cpp +++ b/src/TC/src/FfmpegSwDecoder.cpp @@ -221,6 +221,32 @@ struct FfmpegDecodeFrame_Impl { return true; } + + bool SaveGRAY16LE(AVFrame* pframe) { + size_t size = frame->width * frame->height * 2; + + if (!dec_frame) { + dec_frame = Buffer::MakeOwnMem(size); + } else if (size != dec_frame->GetRawMemSize()) { + delete dec_frame; + dec_frame = Buffer::MakeOwnMem(size); + } + + auto plane = 0U; + auto* dst = dec_frame->GetDataAs(); + + auto* src = frame->data[plane]; + auto width = frame->width; + auto height = frame->height; + + for (int i = 0; i < height; i++) { + memcpy(dst, src, 2*width); + dst += 2*width; + src += frame->linesize[plane]; + } + + return true; + } bool SaveYUV444(AVFrame* pframe) { @@ -297,6 +323,8 @@ struct FfmpegDecodeFrame_Impl { return SaveYUV444(frame); case AV_PIX_FMT_GRAY12LE: return SaveGRAY12LE(frame); + case AV_PIX_FMT_GRAY16LE: + return SaveGRAY16LE(frame); default: cerr << __FUNCTION__ << ": unsupported pixel format: " << frame->format << endl; @@ -423,6 +451,9 @@ void FfmpegDecodeFrame::GetParams(MuxingParams& params) case AV_PIX_FMT_GRAY12LE: params.videoContext.format = GRAY12; break; + case AV_PIX_FMT_GRAY16LE: + params.videoContext.format = GRAY16; + break; default: stringstream ss; ss << "Unsupported FFmpeg pixel format: "