raw_data_format.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #include "raw_data_format.h"
  2. #include <set>
  3. #include <string.h>
  4. UVIPCMessage* MakeUVIPCMsg(YUVRawDataI420* data_, unsigned long long* recv_handl_list, int num, unsigned int type)
  5. {
  6. if (NULL == data_)
  7. return NULL;
  8. IYUVRawDataI420Converter* yuv_data_converter = dynamic_cast<IYUVRawDataI420Converter*>(data_);
  9. if (NULL == yuv_data_converter)
  10. return NULL;
  11. unsigned int dataBufferLen = (data_->GetStreamWidth()*data_->GetStreamHeight()*3)/2;
  12. int ipc_msg_buffer_len = sizeof(VideoRawDataHeader) + sizeof(unsigned long long) * num + dataBufferLen;//head+recv_list+buffer
  13. UVIPCMessage* rawdata_msg = new UVIPCMessage(NULL, ipc_msg_buffer_len);
  14. if (NULL == rawdata_msg)
  15. return NULL;
  16. char* buf_ptr = rawdata_msg->GetBuf();
  17. if (NULL == buf_ptr)
  18. {
  19. rawdata_msg->Release();
  20. return NULL;
  21. }
  22. unsigned long long* recv_list = (unsigned long long*)(buf_ptr + sizeof(VideoRawDataHeader));
  23. memcpy(recv_list, recv_handl_list, sizeof(unsigned long long) * num); //checked safe
  24. YUVRawDataI420* filled_data = yuv_data_converter->ConvertToYUVViaExternalBuffer(buf_ptr + sizeof(VideoRawDataHeader) + sizeof(unsigned long long) * num, dataBufferLen);
  25. if (filled_data)
  26. {
  27. //fill header
  28. VideoRawDataHeader* head_ptr = (VideoRawDataHeader*)buf_ptr;
  29. head_ptr->common_header.type = type;
  30. head_ptr->recv_handle_len = num;
  31. head_ptr->dataBufferLen = filled_data->GetBufferLen();
  32. head_ptr->isLimitedI420 = filled_data->IsLimitedI420() ? 1 : 0;
  33. head_ptr->width = filled_data->GetStreamWidth();
  34. head_ptr->height = filled_data->GetStreamHeight();
  35. head_ptr->rotation = filled_data->GetRotation();
  36. head_ptr->y_offset = (unsigned long long)filled_data->GetYBuffer() - (unsigned long long)filled_data->GetBuffer();
  37. head_ptr->u_offset = (unsigned long long)filled_data->GetUBuffer() - (unsigned long long)filled_data->GetBuffer();
  38. head_ptr->v_offset = (unsigned long long)filled_data->GetVBuffer() - (unsigned long long)filled_data->GetBuffer();
  39. head_ptr->source_id = filled_data->GetSourceID();
  40. filled_data->Release();
  41. }
  42. return rawdata_msg;
  43. }
  44. UVIPCMessage* MakeUVIPCMsg(YUVProcessDataI420* data_, std::set<unsigned long long>& recv_handle, unsigned int type)
  45. {
  46. if (NULL == data_)
  47. return NULL;
  48. IYUVRawDataI420Converter* yuv_data_converter = dynamic_cast<IYUVRawDataI420Converter*>(data_);
  49. if (NULL == yuv_data_converter)
  50. return NULL;
  51. unsigned int dataBufferLen = (data_->GetWidth()*data_->GetHeight() * 3) / 2;
  52. int ipc_msg_buffer_len = sizeof(VideoRawDataHeader) + sizeof(unsigned long long) * recv_handle.size() + dataBufferLen;//head+recv_list+buffer
  53. UVIPCMessage* rawdata_msg = new UVIPCMessage(NULL, ipc_msg_buffer_len);
  54. if (NULL == rawdata_msg)
  55. return NULL;
  56. char* buf_ptr = rawdata_msg->GetBuf();
  57. if (NULL == buf_ptr)
  58. {
  59. rawdata_msg->Release();
  60. return NULL;
  61. }
  62. unsigned long long* recv_list = (unsigned long long*)(buf_ptr + sizeof(VideoRawDataHeader));
  63. std::set<unsigned long long>::iterator iter = recv_handle.begin();
  64. int index = 0;
  65. while (recv_handle.end() != iter)
  66. {
  67. recv_list[index] = *iter;
  68. index++;
  69. iter++;
  70. }
  71. YUVRawDataI420* filled_data = yuv_data_converter->ConvertToYUVViaExternalBuffer(buf_ptr + sizeof(VideoRawDataHeader) + sizeof(unsigned long long) * recv_handle.size(), dataBufferLen);
  72. if (filled_data)
  73. {
  74. //fill header
  75. VideoRawDataHeader* head_ptr = (VideoRawDataHeader*)buf_ptr;
  76. head_ptr->common_header.type = type;
  77. head_ptr->recv_handle_len = recv_handle.size();
  78. head_ptr->dataBufferLen = filled_data->GetBufferLen();
  79. head_ptr->isLimitedI420 = filled_data->IsLimitedI420() ? 1 : 0;
  80. head_ptr->width = filled_data->GetStreamWidth();
  81. head_ptr->height = filled_data->GetStreamHeight();
  82. head_ptr->rotation = filled_data->GetRotation();
  83. head_ptr->y_offset = (unsigned long long)filled_data->GetYBuffer() - (unsigned long long)filled_data->GetBuffer();
  84. head_ptr->u_offset = (unsigned long long)filled_data->GetUBuffer() - (unsigned long long)filled_data->GetBuffer();
  85. head_ptr->v_offset = (unsigned long long)filled_data->GetVBuffer() - (unsigned long long)filled_data->GetBuffer();
  86. head_ptr->source_id = filled_data->GetSourceID();
  87. filled_data->Release();
  88. }
  89. return rawdata_msg;
  90. }
  91. UVIPCMessage* MakeUVIPCMsg(AudioRawData* data_, AudioRawDataType audio_rawdata_type, std::string user_id, unsigned int type)
  92. {
  93. if (NULL == data_)
  94. return NULL;
  95. unsigned int dataBufferLen = data_->GetBufferLen();
  96. unsigned int sampleRate = data_->GetSampleRate();
  97. unsigned int channelNum = data_->GetChannelNum();
  98. int ipc_msg_buffer_len = sizeof(AudioRawDataHeader) + dataBufferLen;
  99. UVIPCMessage* rawdata_msg = new UVIPCMessage(NULL, ipc_msg_buffer_len);
  100. if (NULL == rawdata_msg)
  101. return NULL;
  102. char* buf_ptr = rawdata_msg->GetBuf();
  103. if (NULL == buf_ptr)
  104. {
  105. rawdata_msg->Release();
  106. return NULL;
  107. }
  108. //fill header
  109. AudioRawDataHeader* head_ptr = (AudioRawDataHeader*)buf_ptr;
  110. head_ptr->common_header.type = type;
  111. head_ptr->userid = user_id;
  112. head_ptr->dataBufferLen = dataBufferLen;
  113. head_ptr->sampleRate = sampleRate;
  114. head_ptr->channelNum = channelNum;
  115. head_ptr->type = audio_rawdata_type;
  116. //fill buffer
  117. char* data_buf = buf_ptr + sizeof(AudioRawDataHeader);
  118. memcpy(data_buf, data_->GetBuffer(), dataBufferLen); //checked safe
  119. return rawdata_msg;
  120. }