Push Samples into Video Receiver

This commit is contained in:
Florian Märkl 2019-06-01 14:00:07 +02:00
commit 7d448cc8b3
No known key found for this signature in database
GPG key ID: 125BC8A5A6A1E857
4 changed files with 44 additions and 7 deletions

View file

@ -91,6 +91,7 @@ typedef struct chiaki_event_t
typedef void (*ChiakiEventCallback)(ChiakiEvent *event, void *user);
typedef void (*ChiakiAudioFrameCallback)(int16_t *buf, size_t samples_count, void *user);
typedef void (*ChiakiVideoSampleCallback)(uint8_t *buf, size_t buf_size, void *user);
@ -122,6 +123,8 @@ typedef struct chiaki_session_t
void *event_cb_user;
ChiakiAudioFrameCallback audio_frame_cb;
void *audio_frame_cb_user;
ChiakiVideoSampleCallback video_sample_cb;
void *video_sample_cb_user;
ChiakiThread session_thread;
@ -154,6 +157,12 @@ static inline void chiaki_session_set_audio_frame_cb(ChiakiSession *session, Chi
session->audio_frame_cb_user = user;
}
static inline void chiaki_session_set_video_sample_cb(ChiakiSession *session, ChiakiVideoSampleCallback cb, void *user)
{
session->video_sample_cb = cb;
session->video_sample_cb_user = user;
}
static inline void chiaki_session_set_quit_reason(ChiakiSession *session, ChiakiQuitReason reason)
{
if(session->quit_reason != CHIAKI_QUIT_REASON_NONE)

View file

@ -21,6 +21,7 @@
#include "common.h"
#include "log.h"
#include "video.h"
#include "takion.h"
#ifdef __cplusplus
extern "C" {
@ -48,6 +49,8 @@ CHIAKI_EXPORT void chiaki_video_receiver_fini(ChiakiVideoReceiver *video_receive
*/
CHIAKI_EXPORT void chiaki_video_receiver_stream_info(ChiakiVideoReceiver *video_receiver, ChiakiVideoProfile *profiles, size_t profiles_count);
CHIAKI_EXPORT void chiaki_video_receiver_av_packet(ChiakiVideoReceiver *video_receiver, ChiakiTakionAVPacket *header, uint8_t *buf, size_t buf_size);
static inline ChiakiVideoReceiver *chiaki_video_receiver_new(struct chiaki_session_t *session)
{
ChiakiVideoReceiver *video_receiver = CHIAKI_NEW(ChiakiVideoReceiver);

View file

@ -556,18 +556,26 @@ static void nagare_takion_av(ChiakiTakionAVPacket *header, uint8_t *buf, size_t
chiaki_gkcrypt_decrypt(nagare->gkcrypt_remote, key_pos + CHIAKI_GKCRYPT_BLOCK_SIZE, buf, buf_size);
//CHIAKI_LOGD(nagare->log, "AV: index: %u,%u; b@0x1a: %d; is_video: %d; 0xa: %u; 0xc: %u; 0xe: %u; codec: %u; 0x18: %u; adaptive_stream: %u, 0x2c: %u\n",
// header->packet_index, header->frame_index, header->byte_at_0x1a, header->is_video ? 1 : 0, header->word_at_0xa, header->word_at_0xc, header->word_at_0xe, header->codec,
// header->word_at_0x18, header->adaptive_stream_index, header->byte_at_0x2c);
/*CHIAKI_LOGD(nagare->log, "AV: index: %u,%u; b@0x1a: %d; is_video: %d; 0xa: %u; 0xc: %u; 0xe: %u; codec: %u; 0x18: %u; adaptive_stream: %u, 0x2c: %u\n",
header->packet_index, header->frame_index, header->byte_at_0x1a, header->is_video ? 1 : 0, header->word_at_0xa, header->word_at_0xc, header->word_at_0xe, header->codec,
header->word_at_0x18, header->adaptive_stream_index, header->byte_at_0x2c);
chiaki_log_hexdump(nagare->log, CHIAKI_LOG_DEBUG, buf, buf_size);*/
if(header->codec == 5/*buf[0] == 0xf4 && buf_size >= 0x50*/)
if(header->is_video)
{
//CHIAKI_LOGD(nagare->log, "audio!\n");
chiaki_audio_receiver_frame_packet(nagare->session->audio_receiver, buf, 0x50);
chiaki_video_receiver_av_packet(nagare->session->video_receiver, header, buf, buf_size);
}
else
{
//CHIAKI_LOGD(nagare->log, "NON-audio\n");
if(header->codec == 5/*buf[0] == 0xf4 && buf_size >= 0x50*/)
{
//CHIAKI_LOGD(nagare->log, "audio!\n");
chiaki_audio_receiver_frame_packet(nagare->session->audio_receiver, buf, 0x50); // TODO: why 0x50?
}
else
{
//CHIAKI_LOGD(nagare->log, "NON-audio\n");
}
}
/*else if(base_type == 2 && buf[0] != 0xf4)

View file

@ -52,4 +52,21 @@ CHIAKI_EXPORT void chiaki_video_receiver_stream_info(ChiakiVideoReceiver *video_
CHIAKI_LOGI(video_receiver->log, " %zu: %ux%u\n", i, profile->width, profile->height);
chiaki_log_hexdump(video_receiver->log, CHIAKI_LOG_DEBUG, profile->header, profile->header_sz);
}
// TODO: should happen deferred, depending on content of av packets
if(video_receiver->session->video_sample_cb && video_receiver->profiles_count > 0)
{
video_receiver->session->video_sample_cb(video_receiver->profiles[0].header, video_receiver->profiles[0].header_sz, video_receiver->session->video_sample_cb_user);
}
}
CHIAKI_EXPORT void chiaki_video_receiver_av_packet(ChiakiVideoReceiver *video_receiver, ChiakiTakionAVPacket *header, uint8_t *buf, size_t buf_size)
{
if(video_receiver->session->video_sample_cb)
{
if(header->adaptive_stream_index == 0)
{
video_receiver->session->video_sample_cb(buf, buf_size, video_receiver->session->video_sample_cb_user);
}
}
}