Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions include/moq/xqc_moq.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,17 @@ typedef struct {
uint64_t timestamp_us;
uint8_t *video_data;
uint64_t video_len;
const uint8_t *ext_headers;
uint64_t ext_headers_len;
} xqc_moq_video_frame_t;

typedef struct {
uint64_t seq_num;
uint64_t timestamp_us;
uint8_t *audio_data;
uint64_t audio_len;
const uint8_t *ext_headers;
uint64_t ext_headers_len;
} xqc_moq_audio_frame_t;

typedef enum {
Expand Down Expand Up @@ -134,6 +138,7 @@ typedef enum {
XQC_MOQ_MSG_TRACK_STATUS_REQUEST = 0xD,
XQC_MOQ_MSG_TRACK_STATUS = 0xE,
XQC_MOQ_MSG_GOAWAY = 0x10,
XQC_MOQ_MSG_OBJECT_STREAM_EXT = 0x30,
XQC_MOQ_MSG_CLIENT_SETUP = 0x40,
XQC_MOQ_MSG_SERVER_SETUP = 0x41,
XQC_MOQ_MSG_STREAM_HEADER_TRACK = 0x50,
Expand Down
6 changes: 3 additions & 3 deletions moq/demo/xqc_moq_audiodemo_server.c
Original file line number Diff line number Diff line change
Expand Up @@ -341,9 +341,9 @@ void on_audio_frame(xqc_moq_user_session_t *user_session, uint64_t subscribe_id,
{
return;
}
printf("subscribe_id:%"PRIu64", seq_num:%"PRIu64", timestamp_us:%"PRIu64", video_len:%"PRIu64"\n",
subscribe_id, audio_frame->seq_num, audio_frame->timestamp_us, audio_frame->audio_len);

printf("subscribe_id:%"PRIu64", seq_num:%"PRIu64", timestamp_us:%"PRIu64", audio_len:%"PRIu64", ext_headers_len:%"PRIu64"\n",
subscribe_id, audio_frame->seq_num, audio_frame->timestamp_us, audio_frame->audio_len, audio_frame->ext_headers_len);

//printf("audio_data:%s\n",audio_frame->audio_data);

Expand Down
17 changes: 16 additions & 1 deletion moq/demo/xqc_moq_demo_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,17 @@ void on_audio_frame(xqc_moq_user_session_t *user_session, uint64_t subscribe_id,
printf("subscribe_id:%"PRIu64", seq_num:%"PRIu64", timestamp_us:%"PRIu64", audio_len:%"PRIu64", dcid:%s\n",
subscribe_id, audio_frame->seq_num, audio_frame->timestamp_us, audio_frame->audio_len,
xqc_dcid_str_by_scid(ctx.engine, &user_conn->cid));

if (audio_frame->ext_headers && audio_frame->ext_headers_len > 0) {
printf("audio ext headers: raw_len=%"PRIu64", data=", audio_frame->ext_headers_len);
for (uint64_t i = 0; i < audio_frame->ext_headers_len; i++) {
if (audio_frame->ext_headers[i] >= 32 && audio_frame->ext_headers[i] <= 126) {
printf("%c", audio_frame->ext_headers[i]);
} else {
printf("\\x%02x", audio_frame->ext_headers[i]);
}
}
printf("\n");
}
//printf("audio_data:%s\n",audio_frame->audio_data);
}

Expand Down Expand Up @@ -625,6 +635,11 @@ xqc_app_send_callback(int fd, short what, void* arg)
audio_frame.timestamp_us = xqc_now();
audio_frame.audio_len = 1024;
audio_frame.audio_data = payload_audio;

static uint8_t test_ext_data[] = "X test_ext_data";
test_ext_data[0] = '0' + (uint8_t) (user_conn->countdown & 0xFF);
audio_frame.ext_headers = test_ext_data;
audio_frame.ext_headers_len = sizeof(test_ext_data) - 1;
ret = xqc_moq_write_audio_frame(user_conn->moq_session, user_conn->audio_subscribe_id, user_conn->audio_track, &audio_frame);
if (ret < 0) {
printf("xqc_moq_write_audio_frame error\n");
Expand Down
57 changes: 49 additions & 8 deletions moq/moq_media/xqc_moq_media_track.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,19 @@ static void xqc_moq_media_cancel_write(xqc_moq_session_t *session, xqc_moq_track
static xqc_bool_t xqc_moq_media_maybe_cancel_write(xqc_moq_session_t *session, uint64_t subscribe_id,
xqc_moq_track_t *track, xqc_moq_video_frame_t *video_frame);

static void xqc_init_moq_object_ext_with_object(xqc_moq_object_stream_msg_ext_t *obj_ext,
xqc_moq_object_stream_msg_t *object) {
xqc_memset(obj_ext, 0, sizeof(*obj_ext));
obj_ext->subscribe_id = object->subscribe_id;
obj_ext->track_alias = object->track_alias;
obj_ext->group_id = object->group_id;
obj_ext->object_id = object->object_id;
obj_ext->send_order = object->send_order;
obj_ext->status = object->status;
obj_ext->payload = object->payload;
obj_ext->payload_len = object->payload_len;
}

xqc_int_t
xqc_moq_write_video_frame(xqc_moq_session_t *session, uint64_t subscribe_id,
xqc_moq_track_t *track, xqc_moq_video_frame_t *video_frame)
Expand Down Expand Up @@ -90,10 +103,22 @@ xqc_moq_write_video_frame(xqc_moq_session_t *session, uint64_t subscribe_id,
xqc_moq_stream_on_track_write(stream, track, object.group_id, object.object_id, video_frame->seq_num);
xqc_list_add_tail(&stream->list_member, &media_track->write_stream_list);

ret = xqc_moq_write_object_stream_msg(session, stream, &object);
if (ret < 0) {
xqc_log(session->log, XQC_LOG_ERROR, "|write_object_stream_msg error|ret:%d|", ret);
goto error;
if (video_frame->ext_headers != NULL && video_frame->ext_headers_len > 0) {
xqc_moq_object_stream_msg_ext_t obj_ext;
xqc_init_moq_object_ext_with_object(&obj_ext, &object);
obj_ext.extension_header_len = video_frame->ext_headers_len;
obj_ext.extension_header = (uint8_t *)video_frame->ext_headers;
ret = xqc_moq_write_object_stream_msg_ext(session, stream, &obj_ext);
if (ret < 0) {
xqc_log(session->log, XQC_LOG_ERROR, "|write_object_stream_msg error|ret:%d|", ret);
goto error;
}
} else {
ret = xqc_moq_write_object_stream_msg(session, stream, &object);
if (ret < 0) {
xqc_log(session->log, XQC_LOG_ERROR, "|write_object_stream_msg error|ret:%d|", ret);
goto error;
}
}

xqc_usec_t now = xqc_monotonic_timestamp();
Expand Down Expand Up @@ -153,10 +178,22 @@ xqc_moq_write_audio_frame(xqc_moq_session_t *session, uint64_t subscribe_id,
xqc_moq_stream_on_track_write(stream, track, object.group_id, object.object_id, audio_frame->seq_num);
xqc_list_add_tail(&stream->list_member, &media_track->write_stream_list);

ret = xqc_moq_write_object_stream_msg(session, stream, &object);
if (ret < 0) {
xqc_log(session->log, XQC_LOG_ERROR, "|write_object_stream_msg error|ret:%d|", ret);
goto error;
if (audio_frame->ext_headers != NULL && audio_frame->ext_headers_len > 0) {
xqc_moq_object_stream_msg_ext_t obj_ext;
xqc_init_moq_object_ext_with_object(&obj_ext, &object);
obj_ext.extension_header_len = audio_frame->ext_headers_len;
obj_ext.extension_header = (uint8_t *)audio_frame->ext_headers;
ret = xqc_moq_write_object_stream_msg_ext(session, stream, &obj_ext);
if (ret < 0) {
xqc_log(session->log, XQC_LOG_ERROR, "|write_object_stream_msg error|ret:%d|", ret);
goto error;
}
} else {
ret = xqc_moq_write_object_stream_msg(session, stream, &object);
if (ret < 0) {
xqc_log(session->log, XQC_LOG_ERROR, "|write_object_stream_msg error|ret:%d|", ret);
goto error;
}
}

xqc_stream_t *quic_stream = stream->trans_ops.quic_stream(stream->trans_stream);
Expand Down Expand Up @@ -459,6 +496,8 @@ xqc_moq_media_on_object(xqc_moq_session_t *session, xqc_moq_track_t *track, xqc_
video_frame_ext.object_id = object->object_id;

xqc_moq_video_frame_t *video_frame = &video_frame_ext.video_frame;
video_frame->ext_headers = object->extension_header;
video_frame->ext_headers_len = object->extension_header_len;
ret = media_track->container_ops.decode_video(object->payload,
object->payload_len, video_frame);
if (ret < 0) {
Expand All @@ -474,6 +513,8 @@ xqc_moq_media_on_object(xqc_moq_session_t *session, xqc_moq_track_t *track, xqc_
audio_frame_ext.object_id = object->object_id;

xqc_moq_audio_frame_t *audio_frame = &audio_frame_ext.audio_frame;
audio_frame->ext_headers = object->extension_header;
audio_frame->ext_headers_len = object->extension_header_len;
ret = media_track->container_ops.decode_audio(object->payload, object->payload_len, audio_frame);
if (ret < 0) {
xqc_log(session->log, XQC_LOG_ERROR, "|decode_audio_container error|ret:%d|", ret);
Expand Down
Loading
Loading