Advertisement
Guest User

Untitled

a guest
Jul 15th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.03 KB | None | 0 0
  1. // registering all codecs...
  2.  
  3. AVCodec* codec;
  4. AVCodecContext* context;
  5. AVFrame* frame;
  6. AVPacket packet;
  7. SwsContext* transform;
  8.  
  9. codec = avcodec_find_decoder(CODEC_ID_MJPEG); // maybe using libav for jpeg is overoveroverkill, but I'm already using libav for better reasons, so I thought...
  10.  
  11. context = avcodec_alloc_context3(codec); // returns non-null
  12.  
  13. avcodec_open2(context, codec, nullptr) // returns 0
  14.  
  15. context->width = data.Width;
  16. context->height = data.Height;
  17.  
  18. frame = av_frame_alloc();
  19. av_init_packet(&packet);
  20.  
  21. packet.data = data.Ptr;
  22. packet.size = data.Size;
  23.  
  24. int gotPicture = false;
  25. avcodec_decode_video2(context, frame, &gotPicture, &packet); // returns >= 0, gotPicture is true
  26.  
  27. // We init the context the braindead way as using sws_setColorspaceDetails after initing the context doesn't seem to work... (and we can't otherwise set the ranges)
  28. transform = sws_alloc_context ();
  29. av_opt_set_int(transform, "srcw", frame->width, 0);
  30. av_opt_set_int(transform, "srch", frame->height, 0);
  31. av_opt_set_int(transform, "dstw", frame->width, 0);
  32. av_opt_set_int(transform, "dsth", frame->height, 0);
  33. av_opt_set_int(transform, "src_format", context->pix_fmt, 0); // this is AV_PIX_FMT_GRAY8
  34. av_opt_set_int(transform, "dst_format", data.Format, 0); // this is AV_PIX_FMT_NV12
  35. av_opt_set_int(transform, "src_range", 1, 0); // full-range
  36. av_opt_set_int(transform, "dst_range", 1, 0); // full-range
  37. sws_init_context(transform, nullptr, nullptr); // returns >= 0
  38.  
  39. // -1 for guaranteed crashes, can be 0 for potentially wrong behaviour (hard to say) and no error
  40. byte* targetPtr[4] = {(byte*) -1, (byte*) -1, (byte*) -1, (byte*) -1};
  41. int targetStride[4] = {-1, -1, -1, -1};
  42.  
  43. for (int i = 0; i < data.NumPlanes; i++) // this is 2
  44. {
  45. targetPtr[i] = data.TargetPlane;
  46. targetStride[i] = data.TargetStride;
  47. }
  48.  
  49. sws_scale(transform, frame->data, frame->linesize, 0, frame->height, targetPtr, targetStride); // returns frame->height
  50.  
  51. av_frame_free (&frame);
  52. avcodec_close (context);
  53. av_free (context);
  54. sws_freeContext (transform);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement