Skip to content

Commit

Permalink
Ogg FLAC: handle granule pos -1 correctly; use 'samples'
Browse files Browse the repository at this point in the history
A granule position of -1 on a page means that no packets finish on that page.
If we encounter this value, tell the callback that the page contains 0
samples.

Change the terminology to samples instead of frames, as the term 'frame'
has another meaning in context of FLAC.
  • Loading branch information
ziplantil committed Sep 21, 2024
1 parent b6d0430 commit 6f4c0a4
Showing 1 changed file with 20 additions and 5 deletions.
25 changes: 20 additions & 5 deletions src/libFLAC/ogg_encoder_aspect.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,23 +200,38 @@ FLAC__StreamEncoderWriteStatus FLAC__ogg_encoder_aspect_write_callback_wrapper(F
if(is_metadata) {
while(ogg_stream_flush(&aspect->stream_state, &aspect->page) != 0) {
FLAC__int64 page_granule_pos = ogg_page_granulepos(&aspect->page);
uint32_t frames_in_this_page = (uint32_t)(page_granule_pos - aspect->last_page_granule_pos);
uint32_t samples_on_this_page;
if(page_granule_pos == -1) {
/* a granule position of -1 means no packets finish on this page */
samples_on_this_page = 0;
}
else {
samples_on_this_page = (uint32_t)(page_granule_pos - aspect->last_page_granule_pos);
aspect->last_page_granule_pos = page_granule_pos;
}
if(write_callback(encoder, aspect->page.header, aspect->page.header_len, 0, current_frame, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK)
return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
if(write_callback(encoder, aspect->page.body, aspect->page.body_len, frames_in_this_page, current_frame, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK)
if(write_callback(encoder, aspect->page.body, aspect->page.body_len, samples_on_this_page, current_frame, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK)
return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
aspect->last_page_granule_pos = page_granule_pos;
}
}
else {
while(ogg_stream_pageout(&aspect->stream_state, &aspect->page) != 0) {
FLAC__int64 page_granule_pos = ogg_page_granulepos(&aspect->page);
uint32_t frames_in_this_page = (uint32_t)(page_granule_pos - aspect->last_page_granule_pos);
uint32_t samples_on_this_page;
if(page_granule_pos == -1) {
/* a granule position of -1 means no packets finish on this page */
samples_on_this_page = 0;
}
else {
samples_on_this_page = (uint32_t)(page_granule_pos - aspect->last_page_granule_pos);
aspect->last_page_granule_pos = page_granule_pos;
}
if(write_callback(encoder, aspect->page.header, aspect->page.header_len, 0, current_frame, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK)
return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
if(write_callback(encoder, aspect->page.body, aspect->page.body_len, frames_in_this_page, current_frame, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK)
if(write_callback(encoder, aspect->page.body, aspect->page.body_len, samples_on_this_page, current_frame, client_data) != FLAC__STREAM_ENCODER_WRITE_STATUS_OK)
return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
aspect->last_page_granule_pos = page_granule_pos;
}
}
}
Expand Down

0 comments on commit 6f4c0a4

Please sign in to comment.