mirror of
https://github.com/xenia-project/xenia.git
synced 2025-12-06 07:12:03 +01:00
Disallow offset to be set before header, header size fix, audio channels crashfix
This commit is contained in:
parent
7c375879bc
commit
fac2a89d0f
|
|
@ -178,7 +178,7 @@ void XmaContext::SwapInputBuffer(XMA_CONTEXT_DATA* data) {
|
||||||
data->input_buffer_1_valid = 0;
|
data->input_buffer_1_valid = 0;
|
||||||
}
|
}
|
||||||
data->current_buffer ^= 1;
|
data->current_buffer ^= 1;
|
||||||
data->input_buffer_read_offset = 0;
|
data->input_buffer_read_offset = kBitsPerHeader;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool XmaContext::TrySetupNextLoop(XMA_CONTEXT_DATA* data,
|
bool XmaContext::TrySetupNextLoop(XMA_CONTEXT_DATA* data,
|
||||||
|
|
@ -324,9 +324,6 @@ void XmaContext::Decode(XMA_CONTEXT_DATA* data) {
|
||||||
|
|
||||||
// No available data.
|
// No available data.
|
||||||
if (!data->input_buffer_0_valid && !data->input_buffer_1_valid) {
|
if (!data->input_buffer_0_valid && !data->input_buffer_1_valid) {
|
||||||
// 4156081D checks specifically for offset 0x20 when both input buffers
|
|
||||||
// are invalid.
|
|
||||||
data->input_buffer_read_offset = kBitsPerHeader;
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -627,7 +624,7 @@ void XmaContext::Decode(XMA_CONTEXT_DATA* data) {
|
||||||
// assert_true(frame_is_split == (frame_idx == -1));
|
// assert_true(frame_is_split == (frame_idx == -1));
|
||||||
|
|
||||||
// dump_raw(av_frame_, id());
|
// dump_raw(av_frame_, id());
|
||||||
ConvertFrame((const uint8_t**)av_frame_->data, bool(data->is_stereo),
|
ConvertFrame((const uint8_t**)av_frame_->data, bool(av_frame_->channels > 1),
|
||||||
raw_frame_.data());
|
raw_frame_.data());
|
||||||
// decoded_consumed_samples_ += kSamplesPerFrame;
|
// decoded_consumed_samples_ += kSamplesPerFrame;
|
||||||
|
|
||||||
|
|
@ -639,14 +636,9 @@ void XmaContext::Decode(XMA_CONTEXT_DATA* data) {
|
||||||
|
|
||||||
total_samples += id_ == 0 ? kSamplesPerFrame : 0;
|
total_samples += id_ == 0 ? kSamplesPerFrame : 0;
|
||||||
|
|
||||||
uint32_t offset = data->input_buffer_read_offset;
|
uint32_t offset = std::max(kBitsPerHeader, data->input_buffer_read_offset);
|
||||||
// if (offset % (kBytesPerSample * 8) == 0) {
|
|
||||||
// offset = xma::GetPacketFrameOffset(packet);
|
|
||||||
//}
|
|
||||||
offset = static_cast<uint32_t>(
|
offset = static_cast<uint32_t>(
|
||||||
GetNextFrame(current_input_buffer, current_input_size, offset));
|
GetNextFrame(current_input_buffer, current_input_size, offset));
|
||||||
// assert_true((offset == 0) ==
|
|
||||||
// (frame_is_split || (frame_idx + 1 >= frame_count)));
|
|
||||||
if (frame_idx + 1 >= frame_count) {
|
if (frame_idx + 1 >= frame_count) {
|
||||||
// Skip to next packet (no split frame)
|
// Skip to next packet (no split frame)
|
||||||
packets_skip_ = xma::GetPacketSkipCount(packet) + 1;
|
packets_skip_ = xma::GetPacketSkipCount(packet) + 1;
|
||||||
|
|
@ -661,6 +653,8 @@ void XmaContext::Decode(XMA_CONTEXT_DATA* data) {
|
||||||
if (!reuse_input_buffer) {
|
if (!reuse_input_buffer) {
|
||||||
SwapInputBuffer(data);
|
SwapInputBuffer(data);
|
||||||
}
|
}
|
||||||
|
data->input_buffer_read_offset =
|
||||||
|
std::max(kBitsPerHeader, data->input_buffer_read_offset);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -679,6 +673,8 @@ void XmaContext::Decode(XMA_CONTEXT_DATA* data) {
|
||||||
if (!reuse_input_buffer) {
|
if (!reuse_input_buffer) {
|
||||||
SwapInputBuffer(data);
|
SwapInputBuffer(data);
|
||||||
}
|
}
|
||||||
|
data->input_buffer_read_offset =
|
||||||
|
std::max(kBitsPerHeader, data->input_buffer_read_offset);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
offset =
|
offset =
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue