Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static int decode_write(X264_Decode* x264) {
- AVFrame* frame = NULL;
- //AVFrame* swframe = NULL;
- //AVFrame* tmp_frame = NULL;
- int size;
- int ret = 0;
- log_dbg("sending packet");
- ret = avcodec_send_packet(x264->decoder_ctx, x264->pkt);
- if (ret < 0) {
- log_err("could not send packet");
- return ret;
- }
- while (1) {
- log_dbg("allocating frames");
- if (!(frame = av_frame_alloc())/* || !(swframe = av_frame_alloc())*/) {
- log_err("cant allocate frames");
- ret = AVERROR(ENOMEM);
- goto fail;
- }
- log_dbg("receiving frame");
- ret = avcodec_receive_frame(x264->decoder_ctx, frame);
- if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
- av_frame_free(&frame);
- //av_frame_free(&swframe);
- log_dbg("eagain");
- return 0;
- } else if (ret < 0) {
- log_err("cant receieve frame");
- goto fail;
- }
- log_dbg("transfering image from gpu to cpu");
- if (frame->format == X264_Decode::hw_pix_fmt) {
- if ((ret = av_hwframe_transfer_data(x264->frame, frame, 0)) < 0) {
- log_err("cound not transfer hardware frame");
- goto fail;
- }
- //tmp_frame = swframe;
- } else {
- log_err("frame wrong format");
- goto fail;
- }
- fail:
- av_frame_free(&frame);
- //av_frame_free(&swframe);
- if (ret < 0) {
- return ret;
- }
- }
- }
- bool X264_Decode_Frame(X264_Decode* x264, char* x264_buff, int x264_buff_size) {
- cout << "x264 buffer size " << x264_buff_size << endl;
- x264->pkt->data = (uint8_t*)x264_buff;
- x264->pkt->size = x264_buff_size;
- decode_write(x264);
- av_buffer_unref(&x264->packet_buf);
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement