MppDecoder.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #include "MppDecoder.h"
  2. #include <string.h>
  3. #include <iostream>
  4. #include <stdexcept>
  5. bool MppDecoder::init()
  6. {
  7. MppDecCfg cfg = NULL;
  8. RK_U32 need_split = 1;
  9. if (m_rgbData == nullptr)
  10. {
  11. m_rgbData = new unsigned char[m_width * m_height * 3];
  12. }
  13. MPP_RET ret = mpp_create(&m_ctx, &m_mpi);
  14. if (ret)
  15. {
  16. std::cerr << "mpp_create failed\n";
  17. return false;
  18. }
  19. MpiCmd cmd = MPP_CMD_BASE;
  20. MppParam param = NULL;
  21. cmd = MPP_DEC_SET_PARSER_SPLIT_MODE;
  22. param = &need_split;
  23. ret = m_mpi->control(m_ctx, cmd, param);
  24. if (ret)
  25. {
  26. std::cerr << "set parser split mode failed\n";
  27. return false;
  28. }
  29. ret = mpp_init(m_ctx, MPP_CTX_DEC, MPP_VIDEO_CodingMJPEG);
  30. if (ret)
  31. {
  32. std::cerr << "mpp_init failed\n";
  33. return false;
  34. }
  35. MppFrameFormat fmt = MPP_FMT_YUV420SP;
  36. param = &fmt;
  37. ret = m_mpi->control(m_ctx, MPP_DEC_SET_OUTPUT_FORMAT, param);
  38. if (ret)
  39. {
  40. std::cerr << "set format failed\n";
  41. return false;
  42. }
  43. ret = mpp_frame_init(&m_frame);
  44. if (ret)
  45. {
  46. std::cerr << "mpp_frame_init failed\n";
  47. return false;
  48. }
  49. ret = mpp_buffer_group_get_internal(&m_frameGroup, MPP_BUFFER_TYPE_ION);
  50. if (ret)
  51. {
  52. std::cerr << "mpp_buffer_group_get_internal failed\n";
  53. return false;
  54. }
  55. ret = mpp_buffer_group_get_internal(&m_PacketGroup, MPP_BUFFER_TYPE_ION);
  56. if (ret)
  57. {
  58. std::cerr << "mpp_buffer_group_get_internal failed\n";
  59. return false;
  60. }
  61. RK_U32 hor_stride = MPP_ALIGN(m_width, 16);
  62. RK_U32 ver_stride = MPP_ALIGN(m_height, 16);
  63. ret = mpp_buffer_get(m_frameGroup, &m_frameBuffer, hor_stride * ver_stride * 4);
  64. if (ret)
  65. {
  66. std::cerr << "mpp_buffer_get failed\n";
  67. return false;
  68. }
  69. mpp_frame_set_buffer(m_frame, m_frameBuffer);
  70. ret = mpp_buffer_get(m_PacketGroup, &m_packetBuffer, m_width * m_height * 3);
  71. if (ret)
  72. {
  73. std::cerr << "mpp_buffer_get failed\n";
  74. return false;
  75. }
  76. ret = mpp_packet_init_with_buffer(&m_packet, m_packetBuffer);
  77. if (ret)
  78. {
  79. std::cerr << "mpp_packet_init_with_buffer failed\n";
  80. return false;
  81. }
  82. m_inputBufferPtr = (unsigned char *)mpp_buffer_get_ptr(m_packetBuffer);
  83. return true;
  84. }
  85. bool MppDecoder::decodeJpegToRgb(const char *jpegData, size_t jpegSize, unsigned char **rgbData, int *width, int *height)
  86. {
  87. memset(m_inputBufferPtr, 0, m_width * m_height * 3);
  88. memcpy(m_inputBufferPtr, jpegData, jpegSize);
  89. mpp_packet_set_pos(m_packet, m_inputBufferPtr);
  90. mpp_packet_set_length(m_packet, jpegSize);
  91. mpp_packet_set_eos(m_packet);
  92. MPP_RET ret;
  93. ret = m_mpi->poll(m_ctx, MPP_PORT_INPUT, MPP_POLL_BLOCK);
  94. if (ret)
  95. {
  96. std::cerr << "m_mpi->poll failed\n";
  97. return false;
  98. }
  99. ret = m_mpi->dequeue(m_ctx, MPP_PORT_INPUT, &m_task);
  100. if (ret)
  101. {
  102. std::cerr << "m_mpi->dequeue failed\n";
  103. return false;
  104. }
  105. mpp_task_meta_set_packet(m_task, KEY_INPUT_PACKET, m_packet);
  106. mpp_task_meta_set_frame(m_task, KEY_OUTPUT_FRAME, m_frame);
  107. ret = m_mpi->enqueue(m_ctx, MPP_PORT_INPUT, m_task);
  108. if (ret)
  109. {
  110. std::cerr << "m_mpi->enqueue failed\n";
  111. return false;
  112. }
  113. ret = m_mpi->poll(m_ctx, MPP_PORT_OUTPUT, MPP_POLL_BLOCK);
  114. if (ret)
  115. {
  116. std::cerr << "m_mpi->poll failed\n";
  117. return false;
  118. }
  119. ret = m_mpi->dequeue(m_ctx, MPP_PORT_OUTPUT, &m_task);
  120. if (ret)
  121. {
  122. std::cerr << "m_mpi->dequeue failed\n";
  123. return false;
  124. }
  125. if (m_task)
  126. {
  127. MppFrame Output = nullptr;
  128. mpp_task_meta_get_frame(m_task, KEY_OUTPUT_FRAME, &Output);
  129. if (Output)
  130. {
  131. int width = mpp_frame_get_width(Output);
  132. int height = mpp_frame_get_height(Output);
  133. std::cout << "Output Frame Width: " << width << ", Height: " << height << std::endl;
  134. }
  135. }
  136. }
  137. bool MppDecoder::readMemToBuffer(const char *data, size_t size, MppBuffer &buffer)
  138. {
  139. // mpp_buffer_get(m_inputBufferGroup, &buffer, size);
  140. // if (!buffer)
  141. // {
  142. // std::cout << "mpp_buffer_get failed\n";
  143. // return false;
  144. // }
  145. // m_inputBufferPtr = mpp_buffer_get_ptr(buffer);
  146. // if (!m_inputBufferPtr)
  147. // {
  148. // std::cout << "mpp_buffer_get_ptr failed\n";
  149. // return false;
  150. // }
  151. // return true;
  152. }