FormatConvertUtil.cs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using FFmpeg.AutoGen;
  2. using System;
  3. using Vinno.vCloud.FIS.CrossPlatform.Common;
  4. namespace Vinno.vCloud.FIS.CrossPlatform.Windows.LiveVideo
  5. {
  6. public unsafe class FormatConvertUtil : IDisposable
  7. {
  8. private SwsContext* _swsContext;
  9. /// <summary>
  10. /// 转换图像格式
  11. /// </summary>
  12. /// <param name="src">原图像</param>
  13. /// <param name="dest">目标图像</param>
  14. public void Convert(AVFrame* src, AVFrame* dest)
  15. {
  16. if (_swsContext == null)
  17. {
  18. CrossPlatformHelper.Instance.LogWriter?.WriteLineInfo($"Create SwsContext,SRC:{src->width},{src->height},{(AVPixelFormat)src->format},DEST:{dest->width},{dest->height},{(AVPixelFormat)dest->format}");
  19. _swsContext = ffmpeg.sws_getContext(src->width, src->height, ConvertDeprecatedFormat((AVPixelFormat)src->format), dest->width, dest->height, (AVPixelFormat)dest->format, ffmpeg.SWS_BILINEAR, null, null, null);
  20. }
  21. var ret = ffmpeg.sws_scale(_swsContext, src->data, src->linesize, 0, src->height, dest->data, dest->linesize);
  22. if (ret != dest->height)
  23. {
  24. CrossPlatformHelper.Instance.LogWriter?.WriteLineError($"sws_scale error:{ret}");
  25. }
  26. }
  27. private AVPixelFormat ConvertDeprecatedFormat(AVPixelFormat format)
  28. {
  29. switch (format)
  30. {
  31. case AVPixelFormat.AV_PIX_FMT_YUVJ420P:
  32. return AVPixelFormat.AV_PIX_FMT_YUV420P;
  33. case AVPixelFormat.AV_PIX_FMT_YUVJ422P:
  34. return AVPixelFormat.AV_PIX_FMT_YUV422P;
  35. case AVPixelFormat.AV_PIX_FMT_YUVJ444P:
  36. return AVPixelFormat.AV_PIX_FMT_YUV444P;
  37. case AVPixelFormat.AV_PIX_FMT_YUVJ440P:
  38. return AVPixelFormat.AV_PIX_FMT_YUV440P;
  39. default:
  40. return format;
  41. }
  42. }
  43. public void Dispose()
  44. {
  45. if (_swsContext != null)
  46. {
  47. CrossPlatformHelper.Instance.LogWriter?.WriteLineInfo("Free SwsContext!");
  48. ffmpeg.sws_freeContext(_swsContext);
  49. _swsContext = null;
  50. }
  51. }
  52. }
  53. }