Advertisement
Guest User

Untitled

a guest
Mar 4th, 2019
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.56 KB | None | 0 0
  1. static int decode_write(X264_Decode* x264) {
  2.     AVFrame* frame = NULL;
  3.     //AVFrame* swframe = NULL;
  4.     //AVFrame* tmp_frame = NULL;
  5.     int size;
  6.     int ret = 0;
  7.  
  8.     log_dbg("sending packet");
  9.     ret = avcodec_send_packet(x264->decoder_ctx, x264->pkt);
  10.     if (ret < 0) {
  11.         log_err("could not send packet");
  12.         return ret;
  13.     }
  14.  
  15.     while (1) {
  16.         log_dbg("allocating frames");
  17.         if (!(frame = av_frame_alloc())/* || !(swframe = av_frame_alloc())*/) {
  18.             log_err("cant allocate frames");
  19.             ret = AVERROR(ENOMEM);
  20.             goto fail;
  21.         }
  22.         log_dbg("receiving frame");
  23.         ret = avcodec_receive_frame(x264->decoder_ctx, frame);
  24.         if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
  25.             av_frame_free(&frame);
  26.             //av_frame_free(&swframe);
  27.             log_dbg("eagain");
  28.             return 0;
  29.         } else if (ret < 0) {
  30.             log_err("cant receieve frame");
  31.             goto fail;
  32.         }
  33.  
  34.         log_dbg("transfering image from gpu to cpu");
  35.         if (frame->format == X264_Decode::hw_pix_fmt) {
  36.             if ((ret = av_hwframe_transfer_data(x264->frame, frame, 0)) < 0) {
  37.                 log_err("cound not transfer hardware frame");
  38.                 goto fail;
  39.             }
  40.             //tmp_frame = swframe;
  41.         } else {
  42.             log_err("frame wrong format");
  43.             goto fail;
  44.         }
  45.  
  46.         fail:
  47.         av_frame_free(&frame);
  48.         //av_frame_free(&swframe);
  49.         if (ret < 0) {
  50.             return ret;
  51.         }
  52.     }
  53. }
  54.  
  55. bool X264_Decode_Frame(X264_Decode* x264, char* x264_buff, int x264_buff_size) {
  56.     cout << "x264 buffer size " << x264_buff_size << endl;
  57.  
  58.     x264->pkt->data = (uint8_t*)x264_buff;
  59.     x264->pkt->size = x264_buff_size;
  60.     decode_write(x264);
  61.     av_buffer_unref(&x264->packet_buf);
  62.     return true;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement