Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // registering all codecs...
- AVCodec* codec;
- AVCodecContext* context;
- AVFrame* frame;
- AVPacket packet;
- SwsContext* transform;
- 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...
- context = avcodec_alloc_context3(codec); // returns non-null
- avcodec_open2(context, codec, nullptr) // returns 0
- context->width = data.Width;
- context->height = data.Height;
- frame = av_frame_alloc();
- av_init_packet(&packet);
- packet.data = data.Ptr;
- packet.size = data.Size;
- int gotPicture = false;
- avcodec_decode_video2(context, frame, &gotPicture, &packet); // returns >= 0, gotPicture is true
- // 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)
- transform = sws_alloc_context ();
- av_opt_set_int(transform, "srcw", frame->width, 0);
- av_opt_set_int(transform, "srch", frame->height, 0);
- av_opt_set_int(transform, "dstw", frame->width, 0);
- av_opt_set_int(transform, "dsth", frame->height, 0);
- av_opt_set_int(transform, "src_format", context->pix_fmt, 0); // this is AV_PIX_FMT_GRAY8
- av_opt_set_int(transform, "dst_format", data.Format, 0); // this is AV_PIX_FMT_NV12
- av_opt_set_int(transform, "src_range", 1, 0); // full-range
- av_opt_set_int(transform, "dst_range", 1, 0); // full-range
- sws_init_context(transform, nullptr, nullptr); // returns >= 0
- // -1 for guaranteed crashes, can be 0 for potentially wrong behaviour (hard to say) and no error
- byte* targetPtr[4] = {(byte*) -1, (byte*) -1, (byte*) -1, (byte*) -1};
- int targetStride[4] = {-1, -1, -1, -1};
- for (int i = 0; i < data.NumPlanes; i++) // this is 2
- {
- targetPtr[i] = data.TargetPlane;
- targetStride[i] = data.TargetStride;
- }
- sws_scale(transform, frame->data, frame->linesize, 0, frame->height, targetPtr, targetStride); // returns frame->height
- av_frame_free (&frame);
- avcodec_close (context);
- av_free (context);
- sws_freeContext (transform);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement