NAL_PREFIX_SVC = 14
} nal_unit_type;
+typedef enum {
+ MEDIA_TYPE_ENCODED_AUDIO,
+ MEDIA_TYPE_ENCODED_VIDEO,
+ MEDIA_TYPE_RAW_AUDIO,
+ MEDIA_TYPE_RAW_VIDEO,
+} contentsType;
+
#define ES_DEFAULT_VIDEO_PTS_OFFSET 41667000
#define ES_DEFAULT_VIDEO_FPS 24
class EsStreamReader {
public:
explicit EsStreamReader(const std::string dirpath,
- mtpr_media_type_e type) {
+ contentsType type) {
_dirPath = tc_root_dir + dirpath;
_ESDataFile = _dirPath + "MTPR.es";
_ESInfoFile = _dirPath + "MTPR.info";
bool makeMediaFormat() {
media_format_create(&_mediaFormat);
- if (_type == MTPR_MEDIA_TYPE_AUDIO) {
+ if (_type == MEDIA_TYPE_ENCODED_AUDIO ||
+ _type == MEDIA_TYPE_RAW_AUDIO) {
uint32_t mimeType;
uint32_t sampleRate;
uint32_t channels;
+ uint32_t bit;
auto formatStream = std::ifstream(_ESInfoFile, std::ifstream::in);
if (!formatStream.is_open()) {
LOGW("No audio info file: %s", _ESInfoFile.c_str());
return false;
}
- formatStream >> mimeType >> sampleRate >> channels;
- LOGD("mime_type: %u, sampleRate: %u, channels: %u",
- mimeType, sampleRate, channels);
+ formatStream >> mimeType >> sampleRate >> channels >> bit;
+ LOGD("mime_type: %u, sampleRate: %u, channels: %u, bit: %u",
+ mimeType, sampleRate, channels, bit);
formatStream.close();
+ _rawAudioReadSize = channels * bit / 8 * 1024;
+
media_format_set_audio_mime(_mediaFormat, static_cast<media_format_mimetype_e>(mimeType));
media_format_set_audio_samplerate(_mediaFormat, sampleRate);
media_format_set_audio_channel(_mediaFormat, channels);
+ if (bit)
+ media_format_set_audio_bit(_mediaFormat, bit);
return true;
- } else if (_type == MTPR_MEDIA_TYPE_VIDEO) {
+ } else if (_type == MEDIA_TYPE_ENCODED_VIDEO ||
+ _type == MEDIA_TYPE_RAW_VIDEO) {
uint32_t mimeType;
uint32_t width;
uint32_t height;
mimeType, width, height, frameRate);
formatStream.close();
+ _rawVideoReadSize = width * height * 3 / 2;
+
media_format_set_video_mime(_mediaFormat, static_cast<media_format_mimetype_e>(mimeType));
media_format_set_video_width(_mediaFormat, width);
media_format_set_video_height(_mediaFormat, height);
bool ReadNextPacket(media_packet_h* outPacket) {
static uint64_t pts = 0L;
+ uint64_t ptsOffset = 0L;
+ int size = 0;
media_packet_h packet;
if (!_stream.is_open()) {
char* tmp = new char[1000000];
- if (_type == MTPR_MEDIA_TYPE_VIDEO) {
- int size = videobytestream2nalunit(tmp);
- if (size <= 0) {
- delete[] tmp;
- return false;
- }
-
- void *buffer = nullptr;
- media_packet_new_alloc(_mediaFormat, nullptr, nullptr, &packet);
- media_packet_set_pts(packet, pts);
- media_packet_set_duration(packet, ES_DEFAULT_VIDEO_PTS_OFFSET);
- media_packet_set_buffer_size(packet, size);
- media_packet_get_buffer_data_ptr(packet, &buffer);
-
- memcpy(buffer, tmp, size);
-
- pts += ES_DEFAULT_VIDEO_PTS_OFFSET;
-
- *outPacket = packet;
+ switch (_type)
+ {
+ case MEDIA_TYPE_ENCODED_VIDEO:
+ size = videobytestream2nalunit(tmp);
+ ptsOffset = ES_DEFAULT_VIDEO_PTS_OFFSET;
+ break;
+ case MEDIA_TYPE_ENCODED_AUDIO:
+ size = audiobytestream2nalunit(tmp);
+ ptsOffset = ES_DEFAULT_AUDIO_PTS_OFFSET;
+ break;
+ case MEDIA_TYPE_RAW_VIDEO:
+ size = videoRawUnit(tmp);
+ ptsOffset = ES_DEFAULT_VIDEO_PTS_OFFSET;
+ break;
+ case MEDIA_TYPE_RAW_AUDIO:
+ size = audioRawUnit(tmp);
+ ptsOffset = ES_DEFAULT_AUDIO_PTS_OFFSET;
+ break;
+ default:
+ return false;
+ }
- } else if (_type == MTPR_MEDIA_TYPE_AUDIO) {
- int size = audiobytestream2nalunit(tmp);
- if (size <= 0) {
- delete[] tmp;
- return false;
- }
+ if (size <= 0) {
+ delete[] tmp;
+ return false;
+ }
- void *buffer = nullptr;
- media_packet_new_alloc(_mediaFormat, nullptr, nullptr, &packet);
- media_packet_set_pts(packet, pts);
- media_packet_set_duration(packet, ES_DEFAULT_AUDIO_PTS_OFFSET);
- media_packet_set_buffer_size(packet, size);
- media_packet_get_buffer_data_ptr(packet, &buffer);
+ void *buffer = nullptr;
+ media_packet_new_alloc(_mediaFormat, nullptr, nullptr, &packet);
+ media_packet_set_pts(packet, pts);
+ media_packet_set_duration(packet, ptsOffset);
+ media_packet_set_buffer_size(packet, size);
+ media_packet_get_buffer_data_ptr(packet, &buffer);
- memcpy(buffer, tmp, size);
+ memcpy(buffer, tmp, size);
- pts += ES_DEFAULT_AUDIO_PTS_OFFSET;
+ pts += ptsOffset;
- *outPacket = packet;
- }
+ *outPacket = packet;
delete[] tmp;
return true;
return nal_length;
}
+ int audioRawUnit(char *nal)
+ {
+ if (!_rawAudioReadSize) {
+ LOGE("audio read size is zero");
+ return -1;
+ }
+
+ if (GetFileLeftSize_() < _rawAudioReadSize)
+ return -1;
+
+ _stream.read(nal, _rawAudioReadSize);
+
+ return _rawAudioReadSize;
+ }
+
+ int videoRawUnit(char *nal)
+ {
+ if (!_rawVideoReadSize) {
+ LOGE("video read size is zero");
+ return -1;
+ }
+
+ if (GetFileLeftSize_() < _rawVideoReadSize)
+ return -1;
+
+ _stream.read(nal, _rawVideoReadSize);
+
+ return _rawVideoReadSize;
+ }
+
int GetFileLeftSize_(void) {
if (!_stream.is_open()) return 0;
int cur = _stream.tellg();
std::string _ESDataFile;
std::string _ESInfoFile;
std::ifstream _stream;
- mtpr_media_type_e _type;
+ contentsType _type;
+ int _rawAudioReadSize = 0;
+ int _rawVideoReadSize = 0;
media_format_h _mediaFormat = nullptr;
};
static const unsigned numberOfVideoFeedingPacket = 100;
static const unsigned numberOfAudioFeedingPacket = 200;
-static void bufferStateCb(unsigned int sourceId, mtpr_media_packet_source_buffer_state_e state, void *user_data) {
+static void bufferStateCb(unsigned int sourceId,
+ mtpr_media_packet_source_buffer_state_e state, void *user_data) {
LOGD("callback is invoked. sourceId: %d, state: %d", sourceId, state);
static std::once_flag flag;
LOGD("Leave");
}
- std::thread feedingEsPacket(mtpr_h mtpr, const mtpr_media_type_e type, unsigned int source_id, unsigned int feedingPacketCount);
+ std::thread feedingEsPacket(mtpr_h mtpr, const contentsType type,
+ unsigned int source_id, unsigned int feedingPacketCount);
protected:
const std::string _receiverPath = "127.0.0.1:5004";
std::thread _videoFeeder;
};
-std::thread MediaTransporterTestRistPacketSender::feedingEsPacket(mtpr_h mtpr, const mtpr_media_type_e type, unsigned int source_id, unsigned int feedingPacketCount)
+std::thread MediaTransporterTestRistPacketSender::feedingEsPacket(mtpr_h mtpr,
+ const contentsType type, unsigned int source_id, unsigned int feedingPacketCount)
{
EsStreamReader* reader = nullptr;
- reader = (type == MTPR_MEDIA_TYPE_VIDEO) ? _videoEsReader : _audioEsReader;
+ reader = (type == MEDIA_TYPE_ENCODED_VIDEO || type == MEDIA_TYPE_RAW_VIDEO) ?
+ _videoEsReader : _audioEsReader;
auto feeding_task_fn = [mtpr, source_id, reader, feedingPacketCount]() {
unsigned int leftFeedingPacket = feedingPacketCount;
break;
mtpr_media_packet_source_push_packet(mtpr, source_id, pkt);
+
media_packet_unref(pkt);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
ASSERT_EQ(ret, MTPR_ERROR_NONE);
ASSERT_GE(source_id, 0);
- _videoEsReader = new EsStreamReader("video/", MTPR_MEDIA_TYPE_VIDEO);
+ _videoEsReader = new EsStreamReader("video/", MEDIA_TYPE_ENCODED_VIDEO);
ret = mtpr_media_packet_source_set_format(_mtpr, source_id, _videoEsReader->getMediaFormat());
EXPECT_EQ(ret, MTPR_ERROR_NONE);
ASSERT_EQ(ret, MTPR_ERROR_NONE);
ASSERT_GE(source_id, 0);
- _videoEsReader = new EsStreamReader("video/", MTPR_MEDIA_TYPE_VIDEO);
+ _videoEsReader = new EsStreamReader("video/", MEDIA_TYPE_ENCODED_VIDEO);
ret = mtpr_media_packet_source_set_format(_mtpr, source_id, _videoEsReader->getMediaFormat());
EXPECT_EQ(ret, MTPR_ERROR_NONE);
ret = mtpr_start(_mtpr);
EXPECT_EQ(ret, MTPR_ERROR_NONE);
- _videoFeeder = feedingEsPacket(_mtpr, MTPR_MEDIA_TYPE_VIDEO, source_id, numberOfVideoFeedingPacket);
+ _videoFeeder = feedingEsPacket(_mtpr, MEDIA_TYPE_ENCODED_VIDEO, source_id, numberOfVideoFeedingPacket);
if (_videoFeeder.joinable())
_videoFeeder.join();
}
ASSERT_EQ(ret, MTPR_ERROR_NONE);
ASSERT_GE(source_id, 0);
- _audioEsReader = new EsStreamReader("audio/", MTPR_MEDIA_TYPE_AUDIO);
+ _audioEsReader = new EsStreamReader("audio/", MEDIA_TYPE_ENCODED_AUDIO);
ret = mtpr_media_packet_source_set_format(_mtpr, source_id, _audioEsReader->getMediaFormat());
EXPECT_EQ(ret, MTPR_ERROR_NONE);
ret = mtpr_start(_mtpr);
EXPECT_EQ(ret, MTPR_ERROR_NONE);
- _audioFeeder = feedingEsPacket(_mtpr, MTPR_MEDIA_TYPE_AUDIO, source_id, numberOfAudioFeedingPacket);
+ _audioFeeder = feedingEsPacket(_mtpr, MEDIA_TYPE_ENCODED_AUDIO, source_id, numberOfAudioFeedingPacket);
+ if (_audioFeeder.joinable())
_audioFeeder.join();
}
ASSERT_EQ(ret, MTPR_ERROR_NONE);
ASSERT_GE(videoSourceID, 0);
- _audioEsReader = new EsStreamReader("audio/", MTPR_MEDIA_TYPE_AUDIO);
- _videoEsReader = new EsStreamReader("video/", MTPR_MEDIA_TYPE_VIDEO);
+ _audioEsReader = new EsStreamReader("audio/", MEDIA_TYPE_ENCODED_AUDIO);
+ _videoEsReader = new EsStreamReader("video/", MEDIA_TYPE_ENCODED_VIDEO);
ret = mtpr_media_packet_source_set_format(_mtpr, audioSourceID, _audioEsReader->getMediaFormat());
EXPECT_EQ(ret, MTPR_ERROR_NONE);
ret = mtpr_start(_mtpr);
EXPECT_EQ(ret, MTPR_ERROR_NONE);
- _audioFeeder = feedingEsPacket(_mtpr, MTPR_MEDIA_TYPE_AUDIO, audioSourceID, numberOfAudioFeedingPacket);
- _videoFeeder = feedingEsPacket(_mtpr, MTPR_MEDIA_TYPE_VIDEO, videoSourceID, numberOfVideoFeedingPacket);
+ _audioFeeder = feedingEsPacket(_mtpr, MEDIA_TYPE_ENCODED_AUDIO, audioSourceID, numberOfAudioFeedingPacket);
+ _videoFeeder = feedingEsPacket(_mtpr, MEDIA_TYPE_ENCODED_VIDEO, videoSourceID, numberOfVideoFeedingPacket);
if (_audioFeeder.joinable())
_audioFeeder.join();
ASSERT_EQ(ret, MTPR_ERROR_NONE);
ASSERT_GE(source_id, 0);
- _videoEsReader = new EsStreamReader("video/", MTPR_MEDIA_TYPE_VIDEO);
+ _videoEsReader = new EsStreamReader("video/", MEDIA_TYPE_ENCODED_VIDEO);
ret = mtpr_media_packet_source_set_format(_mtpr, source_id, _videoEsReader->getMediaFormat());
EXPECT_EQ(ret, MTPR_ERROR_NONE);
ret = mtpr_start(_mtpr);
EXPECT_EQ(ret, MTPR_ERROR_NONE);
- _videoFeeder = feedingEsPacket(_mtpr, MTPR_MEDIA_TYPE_VIDEO, source_id, numberOfVideoFeedingPacket);
+ _videoFeeder = feedingEsPacket(_mtpr, MEDIA_TYPE_ENCODED_VIDEO, source_id, numberOfVideoFeedingPacket);
ASSERT_TRUE(waitBufferStateCallback(f));
ASSERT_EQ(ret, MTPR_ERROR_NONE);
ASSERT_GE(source_id, 0);
- _videoEsReader = new EsStreamReader("video/", MTPR_MEDIA_TYPE_VIDEO);
+ _videoEsReader = new EsStreamReader("video/", MEDIA_TYPE_ENCODED_VIDEO);
ret = mtpr_media_packet_source_set_format(_mtpr, source_id, _videoEsReader->getMediaFormat());
EXPECT_EQ(ret, MTPR_ERROR_NONE);
ret = mtpr_start(_mtpr);
EXPECT_EQ(ret, MTPR_ERROR_NONE);
- _videoFeeder = feedingEsPacket(_mtpr, MTPR_MEDIA_TYPE_VIDEO, source_id, numberOfVideoFeedingPacket);
+ _videoFeeder = feedingEsPacket(_mtpr, MEDIA_TYPE_ENCODED_VIDEO, source_id, numberOfVideoFeedingPacket);
+
+ if (_videoFeeder.joinable())
+ _videoFeeder.join();
+}
+
+TEST_F(MediaTransporterTestRistPacketSender, push_media_raw_video_packet)
+{
+ int ret = MTPR_ERROR_NONE;
+ unsigned int source_id = 0;
+
+ ret = mtpr_set_receiver_address(_mtpr, _receiverPath.c_str());
+ ASSERT_EQ(ret, MTPR_ERROR_NONE);
+
+ ret = mtpr_add_media_source(_mtpr, MTPR_SOURCE_TYPE_MEDIAPACKET, &source_id);
+ ASSERT_EQ(ret, MTPR_ERROR_NONE);
+ ASSERT_GE(source_id, 0);
+
+ _videoEsReader = new EsStreamReader("raw_video/", MEDIA_TYPE_RAW_VIDEO);
+
+ ret = mtpr_media_packet_source_set_format(_mtpr, source_id, _videoEsReader->getMediaFormat());
+ EXPECT_EQ(ret, MTPR_ERROR_NONE);
+
+ ret = mtpr_start(_mtpr);
+ EXPECT_EQ(ret, MTPR_ERROR_NONE);
+
+ _videoFeeder = feedingEsPacket(_mtpr, MEDIA_TYPE_RAW_VIDEO, source_id, numberOfVideoFeedingPacket);
+ if (_videoFeeder.joinable())
+ _videoFeeder.join();
+}
+
+TEST_F(MediaTransporterTestRistPacketSender, push_media_raw_audio_packet)
+{
+ int ret = MTPR_ERROR_NONE;
+ unsigned int source_id = 0;
+
+ ret = mtpr_set_receiver_address(_mtpr, _receiverPath.c_str());
+ ASSERT_EQ(ret, MTPR_ERROR_NONE);
+
+ ret = mtpr_add_media_source(_mtpr, MTPR_SOURCE_TYPE_MEDIAPACKET, &source_id);
+ ASSERT_EQ(ret, MTPR_ERROR_NONE);
+ ASSERT_GE(source_id, 0);
+
+ _audioEsReader = new EsStreamReader("raw_audio/", MEDIA_TYPE_RAW_AUDIO);
+
+ ret = mtpr_media_packet_source_set_format(_mtpr, source_id, _audioEsReader->getMediaFormat());
+ EXPECT_EQ(ret, MTPR_ERROR_NONE);
+
+ ret = mtpr_start(_mtpr);
+ EXPECT_EQ(ret, MTPR_ERROR_NONE);
+
+ _audioFeeder = feedingEsPacket(_mtpr, MEDIA_TYPE_RAW_AUDIO, source_id, numberOfAudioFeedingPacket);
+ if (_audioFeeder.joinable())
+ _audioFeeder.join();
+}
+
+TEST_F(MediaTransporterTestRistPacketSender, push_media_raw_av_packet)
+{
+ int ret = MTPR_ERROR_NONE;
+ unsigned int audioSourceID = 0;
+ unsigned int videoSourceID = 0;
+
+ ret = mtpr_set_receiver_address(_mtpr, _receiverPath.c_str());
+ ASSERT_EQ(ret, MTPR_ERROR_NONE);
+
+ ret = mtpr_add_media_source(_mtpr, MTPR_SOURCE_TYPE_MEDIAPACKET, &audioSourceID);
+ ASSERT_EQ(ret, MTPR_ERROR_NONE);
+ ASSERT_GE(audioSourceID, 0);
+
+ ret = mtpr_add_media_source(_mtpr, MTPR_SOURCE_TYPE_MEDIAPACKET, &videoSourceID);
+ ASSERT_EQ(ret, MTPR_ERROR_NONE);
+ ASSERT_GE(videoSourceID, 0);
+
+ _audioEsReader = new EsStreamReader("raw_audio/", MEDIA_TYPE_RAW_AUDIO);
+ _videoEsReader = new EsStreamReader("raw_video/", MEDIA_TYPE_RAW_VIDEO);
+
+ ret = mtpr_media_packet_source_set_format(_mtpr, audioSourceID, _audioEsReader->getMediaFormat());
+ EXPECT_EQ(ret, MTPR_ERROR_NONE);
+
+ ret = mtpr_media_packet_source_set_format(_mtpr, videoSourceID, _videoEsReader->getMediaFormat());
+ EXPECT_EQ(ret, MTPR_ERROR_NONE);
+
+ ret = mtpr_start(_mtpr);
+ EXPECT_EQ(ret, MTPR_ERROR_NONE);
+
+ _audioFeeder = feedingEsPacket(_mtpr, MEDIA_TYPE_RAW_AUDIO, audioSourceID, numberOfAudioFeedingPacket);
+ _videoFeeder = feedingEsPacket(_mtpr, MEDIA_TYPE_RAW_VIDEO, videoSourceID, numberOfVideoFeedingPacket);
+
+ if (_audioFeeder.joinable())
+ _audioFeeder.join();
if (_videoFeeder.joinable())
_videoFeeder.join();