mirror of
https://github.com/webmproject/libwebp.git
synced 2025-07-13 14:34:33 +02:00
Create WebPMuxFrameInfo struct for Mux APIs
Change-Id: I1f3b15d679280b5347124e1d59865a3df089043b
This commit is contained in:
@ -317,8 +317,10 @@ WebPMuxError WebPMuxSetLoopCount(WebPMux* mux, int loop_count) {
|
||||
}
|
||||
|
||||
static WebPMuxError MuxPushFrameTileInternal(
|
||||
WebPMux* const mux, const WebPData* const bitstream, int x_offset,
|
||||
int y_offset, int duration, int copy_data, uint32_t tag) {
|
||||
WebPMux* const mux, const WebPMuxFrameInfo* const frame_tile_info,
|
||||
int copy_data, uint32_t tag) {
|
||||
const WebPData* bitstream;
|
||||
int x_offset, y_offset, duration;
|
||||
WebPChunk chunk;
|
||||
WebPData image;
|
||||
WebPData alpha;
|
||||
@ -330,13 +332,21 @@ static WebPMuxError MuxPushFrameTileInternal(
|
||||
int image_tag;
|
||||
|
||||
// Sanity checks.
|
||||
if (mux == NULL || bitstream == NULL || bitstream->bytes_ == NULL ||
|
||||
bitstream->size_ > MAX_CHUNK_PAYLOAD) {
|
||||
if (mux == NULL || frame_tile_info == NULL) {
|
||||
return WEBP_MUX_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
bitstream = &frame_tile_info->bitstream_;
|
||||
x_offset = frame_tile_info->x_offset_;
|
||||
y_offset = frame_tile_info->y_offset_;
|
||||
duration = is_frame ? frame_tile_info->duration_ : 1 /* unused */;
|
||||
|
||||
if (bitstream->bytes_ == NULL || bitstream->size_ > MAX_CHUNK_PAYLOAD) {
|
||||
return WEBP_MUX_INVALID_ARGUMENT;
|
||||
}
|
||||
if (x_offset < 0 || x_offset >= MAX_POSITION_OFFSET ||
|
||||
y_offset < 0 || y_offset >= MAX_POSITION_OFFSET ||
|
||||
duration <= 0 || duration > MAX_DURATION) {
|
||||
(is_frame && (duration <= 0 || duration > MAX_DURATION))) {
|
||||
return WEBP_MUX_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
@ -397,18 +407,17 @@ static WebPMuxError MuxPushFrameTileInternal(
|
||||
return err;
|
||||
}
|
||||
|
||||
WebPMuxError WebPMuxPushFrame(WebPMux* mux, const WebPData* bitstream,
|
||||
int x_offset, int y_offset,
|
||||
int duration, int copy_data) {
|
||||
return MuxPushFrameTileInternal(mux, bitstream, x_offset, y_offset,
|
||||
duration, copy_data, kChunks[IDX_FRAME].tag);
|
||||
WebPMuxError WebPMuxPushFrame(WebPMux* mux,
|
||||
const WebPMuxFrameInfo* frame,
|
||||
int copy_data) {
|
||||
return MuxPushFrameTileInternal(mux, frame, copy_data,
|
||||
kChunks[IDX_FRAME].tag);
|
||||
}
|
||||
|
||||
WebPMuxError WebPMuxPushTile(WebPMux* mux, const WebPData* bitstream,
|
||||
int x_offset, int y_offset,
|
||||
WebPMuxError WebPMuxPushTile(WebPMux* mux,
|
||||
const WebPMuxFrameInfo* tile,
|
||||
int copy_data) {
|
||||
return MuxPushFrameTileInternal(mux, bitstream, x_offset, y_offset,
|
||||
1 /* unused duration */, copy_data,
|
||||
return MuxPushFrameTileInternal(mux, tile /*unused duration*/, copy_data,
|
||||
kChunks[IDX_TILE].tag);
|
||||
}
|
||||
|
||||
|
@ -315,9 +315,8 @@ WebPMuxError WebPMuxGetLoopCount(const WebPMux* mux, int* loop_count) {
|
||||
}
|
||||
|
||||
static WebPMuxError MuxGetFrameTileInternal(
|
||||
const WebPMux* const mux, uint32_t nth, WebPData* const bitstream,
|
||||
int* const x_offset, int* const y_offset, int* const duration,
|
||||
uint32_t tag) {
|
||||
const WebPMux* const mux, uint32_t nth,
|
||||
WebPMuxFrameInfo* const frame_tile_info, uint32_t tag) {
|
||||
const WebPData* frame_tile_data;
|
||||
WebPMuxError err;
|
||||
WebPMuxImage* wpi;
|
||||
@ -326,8 +325,7 @@ static WebPMuxError MuxGetFrameTileInternal(
|
||||
const CHUNK_INDEX idx = is_frame ? IDX_FRAME : IDX_TILE;
|
||||
const WebPChunkId id = kChunks[idx].id;
|
||||
|
||||
if (mux == NULL || bitstream == NULL ||
|
||||
x_offset == NULL || y_offset == NULL || (is_frame && duration == NULL)) {
|
||||
if (mux == NULL || frame_tile_info == NULL) {
|
||||
return WEBP_MUX_INVALID_ARGUMENT;
|
||||
}
|
||||
|
||||
@ -340,25 +338,23 @@ static WebPMuxError MuxGetFrameTileInternal(
|
||||
frame_tile_data = &wpi->header_->data_;
|
||||
|
||||
if (frame_tile_data->size_ < kChunks[idx].size) return WEBP_MUX_BAD_DATA;
|
||||
*x_offset = 2 * GetLE24(frame_tile_data->bytes_ + 0);
|
||||
*y_offset = 2 * GetLE24(frame_tile_data->bytes_ + 3);
|
||||
if (is_frame) *duration = 1 + GetLE24(frame_tile_data->bytes_ + 12);
|
||||
frame_tile_info->x_offset_ = 2 * GetLE24(frame_tile_data->bytes_ + 0);
|
||||
frame_tile_info->y_offset_ = 2 * GetLE24(frame_tile_data->bytes_ + 3);
|
||||
if (is_frame) {
|
||||
frame_tile_info->duration_ = 1 + GetLE24(frame_tile_data->bytes_ + 12);
|
||||
}
|
||||
|
||||
return SynthesizeBitstream(wpi, bitstream);
|
||||
return SynthesizeBitstream(wpi, &frame_tile_info->bitstream_);
|
||||
}
|
||||
|
||||
WebPMuxError WebPMuxGetFrame(const WebPMux* mux, uint32_t nth,
|
||||
WebPData* bitstream,
|
||||
int* x_offset, int* y_offset, int* duration) {
|
||||
return MuxGetFrameTileInternal(mux, nth, bitstream, x_offset, y_offset,
|
||||
duration, kChunks[IDX_FRAME].tag);
|
||||
WebPMuxFrameInfo* frame) {
|
||||
return MuxGetFrameTileInternal(mux, nth, frame, kChunks[IDX_FRAME].tag);
|
||||
}
|
||||
|
||||
WebPMuxError WebPMuxGetTile(const WebPMux* mux, uint32_t nth,
|
||||
WebPData* bitstream,
|
||||
int* x_offset, int* y_offset) {
|
||||
return MuxGetFrameTileInternal(mux, nth, bitstream, x_offset, y_offset, NULL,
|
||||
kChunks[IDX_TILE].tag);
|
||||
WebPMuxFrameInfo* tile) {
|
||||
return MuxGetFrameTileInternal(mux, nth, tile, kChunks[IDX_TILE].tag);
|
||||
}
|
||||
|
||||
// Get chunk index from chunk id. Returns IDX_NIL if not found.
|
||||
|
Reference in New Issue
Block a user