diff --git a/lib/include/chiaki/session.h b/lib/include/chiaki/session.h index 44c0e81..20b3d55 100644 --- a/lib/include/chiaki/session.h +++ b/lib/include/chiaki/session.h @@ -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) diff --git a/lib/include/chiaki/videoreceiver.h b/lib/include/chiaki/videoreceiver.h index 1d94ffa..5ed6e9b 100644 --- a/lib/include/chiaki/videoreceiver.h +++ b/lib/include/chiaki/videoreceiver.h @@ -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); diff --git a/lib/src/nagare.c b/lib/src/nagare.c index 64b6eb9..c2de32c 100644 --- a/lib/src/nagare.c +++ b/lib/src/nagare.c @@ -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) diff --git a/lib/src/videoreceiver.c b/lib/src/videoreceiver.c index 0e675b8..0c20220 100644 --- a/lib/src/videoreceiver.c +++ b/lib/src/videoreceiver.c @@ -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); + } + } } \ No newline at end of file