mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
exr: track channels properties
Needed for proper decoding of channels with subsampling and also for remaining compression methods. Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
parent
d9fad53f4b
commit
a71926a548
@ -48,6 +48,17 @@ enum ExrCompr {
|
|||||||
EXR_B44A = 7,
|
EXR_B44A = 7,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum ExrPixelType {
|
||||||
|
EXR_UINT,
|
||||||
|
EXR_HALF,
|
||||||
|
EXR_FLOAT
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef struct EXRChannel {
|
||||||
|
int xsub, ysub;
|
||||||
|
enum ExrPixelType pixel_type;
|
||||||
|
} EXRChannel;
|
||||||
|
|
||||||
typedef struct EXRThreadData {
|
typedef struct EXRThreadData {
|
||||||
uint8_t *uncompressed_data;
|
uint8_t *uncompressed_data;
|
||||||
int uncompressed_size;
|
int uncompressed_size;
|
||||||
@ -73,6 +84,9 @@ typedef struct EXRContext {
|
|||||||
const uint8_t *buf, *table;
|
const uint8_t *buf, *table;
|
||||||
int buf_size;
|
int buf_size;
|
||||||
|
|
||||||
|
EXRChannel *channels;
|
||||||
|
int nb_channels;
|
||||||
|
|
||||||
EXRThreadData *thread_data;
|
EXRThreadData *thread_data;
|
||||||
int thread_data_size;
|
int thread_data_size;
|
||||||
} EXRContext;
|
} EXRContext;
|
||||||
@ -405,6 +419,7 @@ static int decode_frame(AVCodecContext *avctx,
|
|||||||
s->channel_offsets[2] = -1;
|
s->channel_offsets[2] = -1;
|
||||||
s->channel_offsets[3] = -1;
|
s->channel_offsets[3] = -1;
|
||||||
s->bits_per_color_id = -1;
|
s->bits_per_color_id = -1;
|
||||||
|
s->nb_channels = 0;
|
||||||
s->compr = -1;
|
s->compr = -1;
|
||||||
s->buf = buf;
|
s->buf = buf;
|
||||||
s->buf_size = buf_size;
|
s->buf_size = buf_size;
|
||||||
@ -443,6 +458,7 @@ static int decode_frame(AVCodecContext *avctx,
|
|||||||
|
|
||||||
channel_list_end = buf + variable_buffer_data_size;
|
channel_list_end = buf + variable_buffer_data_size;
|
||||||
while (channel_list_end - buf >= 19) {
|
while (channel_list_end - buf >= 19) {
|
||||||
|
EXRChannel *channel;
|
||||||
int current_bits_per_color_id = -1;
|
int current_bits_per_color_id = -1;
|
||||||
int channel_index = -1;
|
int channel_index = -1;
|
||||||
int xsub, ysub;
|
int xsub, ysub;
|
||||||
@ -489,6 +505,14 @@ static int decode_frame(AVCodecContext *avctx,
|
|||||||
s->channel_offsets[channel_index] = current_channel_offset;
|
s->channel_offsets[channel_index] = current_channel_offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
s->channels = av_realloc_f(s->channels, ++s->nb_channels, sizeof(EXRChannel));
|
||||||
|
if (!s->channels)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
channel = &s->channels[s->nb_channels - 1];
|
||||||
|
channel->pixel_type = current_bits_per_color_id;
|
||||||
|
channel->xsub = xsub;
|
||||||
|
channel->ysub = ysub;
|
||||||
|
|
||||||
current_channel_offset += 1 << current_bits_per_color_id;
|
current_channel_offset += 1 << current_bits_per_color_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -725,6 +749,7 @@ static av_cold int decode_end(AVCodecContext *avctx)
|
|||||||
|
|
||||||
av_freep(&s->thread_data);
|
av_freep(&s->thread_data);
|
||||||
s->thread_data_size = 0;
|
s->thread_data_size = 0;
|
||||||
|
av_freep(&s->channels);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user