mirror of
https://github.com/curioustorvald/tsvm.git
synced 2026-03-07 11:51:49 +09:00
tavenc: proper sync packet after i-frames
This commit is contained in:
@@ -269,6 +269,7 @@ void tav_encoder_get_stats(tav_encoder_context_t *ctx, tav_encoder_stats_t *stat
|
||||
#define TAV_PACKET_LOOP_START 0xF0 // Loop point start (no payload)
|
||||
#define TAV_PACKET_GOP_SYNC 0xFC // GOP sync (frame count marker)
|
||||
#define TAV_PACKET_TIMECODE 0xFD // Timecode metadata
|
||||
#define TAV_PACKET_SYNC 0xFF // Sync packet (no payload)
|
||||
|
||||
// =============================================================================
|
||||
// Tile Settings (for multi-tile mode)
|
||||
|
||||
@@ -704,7 +704,7 @@ int tav_encoder_encode_frame(tav_encoder_context_t *ctx,
|
||||
|
||||
// Encode GOP
|
||||
int result;
|
||||
if (ctx->enable_temporal_dwt && ctx->gop_size > 1) {
|
||||
if (ctx->enable_temporal_dwt) {
|
||||
result = encode_gop_unified(ctx, &slot);
|
||||
} else {
|
||||
result = encode_gop_intra_only(ctx, &slot);
|
||||
|
||||
@@ -686,6 +686,16 @@ static int write_gop_sync_packet(FILE *fp, int frame_count) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write sync packet (0xFF) for intra-only mode.
|
||||
* Format: [type(1)] (no payload)
|
||||
*/
|
||||
static int write_sync_packet(FILE *fp) {
|
||||
uint8_t packet = TAV_PACKET_SYNC;
|
||||
fwrite(&packet, 1, 1, fp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// =============================================================================
|
||||
// Audio Encoding Functions
|
||||
// =============================================================================
|
||||
@@ -1517,12 +1527,14 @@ static int encode_video_mt(cli_context_t *cli) {
|
||||
cli->total_bytes += job->packet->size;
|
||||
cli->gop_count++;
|
||||
|
||||
// Write GOP_SYNC
|
||||
// Write sync packet
|
||||
if (job->packet->packet_type == TAV_PACKET_GOP_UNIFIED) {
|
||||
// For 3D-DWT mode, write GOP_SYNC (0xFC) with frame count
|
||||
int frames_in_gop = job->packet->data[1];
|
||||
write_gop_sync_packet(cli->output_fp, frames_in_gop);
|
||||
} else if (job->packet->packet_type == TAV_PACKET_IFRAME) {
|
||||
write_gop_sync_packet(cli->output_fp, 1);
|
||||
// For intra-only mode, write SYNC (0xFF) with no payload
|
||||
write_sync_packet(cli->output_fp);
|
||||
}
|
||||
|
||||
tav_encoder_free_packet(job->packet);
|
||||
@@ -1583,7 +1595,7 @@ static int encode_video_mt(cli_context_t *cli) {
|
||||
if (job->packet->packet_type == TAV_PACKET_GOP_UNIFIED) {
|
||||
write_gop_sync_packet(cli->output_fp, job->packet->data[1]);
|
||||
} else if (job->packet->packet_type == TAV_PACKET_IFRAME) {
|
||||
write_gop_sync_packet(cli->output_fp, 1);
|
||||
write_sync_packet(cli->output_fp);
|
||||
}
|
||||
|
||||
tav_encoder_free_packet(job->packet);
|
||||
@@ -1718,7 +1730,7 @@ static int encode_video_mt(cli_context_t *cli) {
|
||||
if (job->packet->packet_type == TAV_PACKET_GOP_UNIFIED) {
|
||||
write_gop_sync_packet(cli->output_fp, job->packet->data[1]);
|
||||
} else if (job->packet->packet_type == TAV_PACKET_IFRAME) {
|
||||
write_gop_sync_packet(cli->output_fp, 1);
|
||||
write_sync_packet(cli->output_fp);
|
||||
}
|
||||
|
||||
tav_encoder_free_packet(job->packet);
|
||||
@@ -2002,12 +2014,12 @@ static int encode_video(cli_context_t *cli) {
|
||||
cli->total_bytes += packet->size;
|
||||
cli->gop_count++;
|
||||
|
||||
// 4. Write GOP_SYNC after GOP packets
|
||||
// 4. Write sync packet after video packets
|
||||
if (packet->packet_type == TAV_PACKET_GOP_UNIFIED) {
|
||||
int frames_in_gop = packet->data[1];
|
||||
write_gop_sync_packet(cli->output_fp, frames_in_gop);
|
||||
} else if (packet->packet_type == TAV_PACKET_IFRAME) {
|
||||
write_gop_sync_packet(cli->output_fp, 1);
|
||||
write_sync_packet(cli->output_fp);
|
||||
}
|
||||
|
||||
tav_encoder_free_packet(packet);
|
||||
@@ -2066,12 +2078,12 @@ static int encode_video(cli_context_t *cli) {
|
||||
cli->total_bytes += packet->size;
|
||||
cli->gop_count++;
|
||||
|
||||
// 4. Write GOP_SYNC after GOP packets
|
||||
// 4. Write sync packet after video packets
|
||||
if (packet->packet_type == TAV_PACKET_GOP_UNIFIED) {
|
||||
int frames_in_gop = packet->data[1];
|
||||
write_gop_sync_packet(cli->output_fp, frames_in_gop);
|
||||
} else if (packet->packet_type == TAV_PACKET_IFRAME) {
|
||||
write_gop_sync_packet(cli->output_fp, 1);
|
||||
write_sync_packet(cli->output_fp);
|
||||
}
|
||||
|
||||
tav_encoder_free_packet(packet);
|
||||
|
||||
Reference in New Issue
Block a user