mirror of
https://github.com/outbackdingo/UltraGrid.git
synced 2026-03-22 06:40:26 +00:00
Decompress multiple tile: fixes
- fixed decompress deinit when one init fails - fixed a crash when number of substream changes - destroyed the new number of substreams but old was allocated
This commit is contained in:
@@ -362,7 +362,7 @@ struct state_video_decoder
|
||||
enum decoder_type_t decoder_type = {}; ///< how will the video data be decoded
|
||||
struct line_decoder *line_decoder = NULL; ///< if the video is uncompressed and only pixelformat change
|
||||
///< is neeeded, use this structure
|
||||
struct state_decompress **decompress_state = NULL; ///< state of the decompress (for every substream)
|
||||
vector<struct state_decompress *> decompress_state; ///< state of the decompress (for every substream)
|
||||
bool accepts_corrupted_frame = false; ///< whether we should pass corrupted frame to decompress
|
||||
bool buffer_swapped = true; /**< variable indicating that display buffer
|
||||
* has been processed and we can write to a new one */
|
||||
@@ -600,7 +600,7 @@ static void *decompress_worker(void *data)
|
||||
|
||||
if (!d->compressed->tiles[d->pos].data)
|
||||
return NULL;
|
||||
d->ret = decompress_frame(decoder->decompress_state[d->pos],
|
||||
d->ret = decompress_frame(decoder->decompress_state.at(d->pos),
|
||||
(unsigned char *) d->out,
|
||||
(unsigned char *) d->compressed->tiles[d->pos].data,
|
||||
d->compressed->tiles[d->pos].data_len,
|
||||
@@ -940,13 +940,10 @@ void video_decoder_remove_display(struct state_video_decoder *decoder)
|
||||
static void cleanup(struct state_video_decoder *decoder)
|
||||
{
|
||||
decoder->decoder_type = UNSET;
|
||||
if(decoder->decompress_state) {
|
||||
for(unsigned int i = 0; i < decoder->max_substreams; ++i) {
|
||||
decompress_done(decoder->decompress_state[i]);
|
||||
}
|
||||
free(decoder->decompress_state);
|
||||
decoder->decompress_state = NULL;
|
||||
for (auto &d : decoder->decompress_state) {
|
||||
decompress_done(d);
|
||||
}
|
||||
decoder->decompress_state.clear();
|
||||
if(decoder->line_decoder) {
|
||||
free(decoder->line_decoder);
|
||||
decoder->line_decoder = NULL;
|
||||
@@ -1109,14 +1106,13 @@ after_linedecoder_lookup:
|
||||
|
||||
/* we didn't find line decoder. So try now regular (aka DXT) decoder */
|
||||
if(*decode_line == NULL) {
|
||||
decoder->decompress_state = (struct state_decompress **)
|
||||
calloc(decoder->max_substreams, sizeof(struct state_decompress *));
|
||||
decoder->decompress_state.resize(decoder->max_substreams);
|
||||
|
||||
// try to probe video format
|
||||
if (comp_int_fmt == VIDEO_CODEC_NONE && decoder->out_codec != VIDEO_CODEC_END) {
|
||||
bool supports_autodetection = decompress_init_multi(desc.color_spec,
|
||||
VIDEO_CODEC_NONE, VIDEO_CODEC_NONE, decoder->decompress_state,
|
||||
decoder->max_substreams);
|
||||
VIDEO_CODEC_NONE, VIDEO_CODEC_NONE, decoder->decompress_state.data(),
|
||||
decoder->decompress_state.size());
|
||||
if (supports_autodetection) {
|
||||
decoder->decoder_type = EXTERNAL_DECODER;
|
||||
return VIDEO_CODEC_END;
|
||||
@@ -1131,14 +1127,13 @@ after_linedecoder_lookup:
|
||||
out_codec = (*it).second;
|
||||
if (decompress_init_multi(desc.color_spec, (*it).first,
|
||||
(*it).second,
|
||||
decoder->decompress_state,
|
||||
decoder->max_substreams)) {
|
||||
decoder->decompress_state.data(),
|
||||
decoder->decompress_state.size())) {
|
||||
decoder->decoder_type = EXTERNAL_DECODER;
|
||||
goto after_decoder_lookup;
|
||||
}
|
||||
}
|
||||
free(decoder->decompress_state);
|
||||
decoder->decompress_state = 0;
|
||||
decoder->decompress_state.clear();
|
||||
}
|
||||
after_decoder_lookup:
|
||||
|
||||
@@ -1370,8 +1365,8 @@ static bool reconfigure_decoder(struct state_video_decoder *decoder,
|
||||
} else if (decoder->decoder_type == EXTERNAL_DECODER) {
|
||||
int buf_size;
|
||||
|
||||
for(unsigned int i = 0; i < decoder->max_substreams; ++i) {
|
||||
buf_size = decompress_reconfigure(decoder->decompress_state[i], desc,
|
||||
for(unsigned int i = 0; i < decoder->decompress_state.size(); ++i) {
|
||||
buf_size = decompress_reconfigure(decoder->decompress_state.at(i), desc,
|
||||
display_requested_rgb_shift[0],
|
||||
display_requested_rgb_shift[1],
|
||||
display_requested_rgb_shift[2],
|
||||
@@ -1384,7 +1379,7 @@ static bool reconfigure_decoder(struct state_video_decoder *decoder,
|
||||
decoder->merged_fb = display_mode != DISPLAY_PROPERTY_VIDEO_SEPARATE_TILES;
|
||||
int res = 0, ret;
|
||||
size_t size = sizeof(res);
|
||||
ret = decompress_get_property(decoder->decompress_state[0],
|
||||
ret = decompress_get_property(decoder->decompress_state.at(0),
|
||||
DECOMPRESS_PROPERTY_ACCEPTS_CORRUPTED_FRAME,
|
||||
&res, &size);
|
||||
decoder->accepts_corrupted_frame = ret && res;
|
||||
|
||||
@@ -160,10 +160,11 @@ static bool try_initialize_decompress(const video_decompress_info *vdi,
|
||||
decompress_state[i] = decompress_init(vdi);
|
||||
|
||||
if (!decompress_state[i]) {
|
||||
for(int j = 0; j < substreams; ++j) {
|
||||
if (decompress_state[i] != NULL)
|
||||
decompress_done(decompress_state[i]);
|
||||
decompress_state[i] = NULL;
|
||||
for(int j = 0; j < i; ++j) {
|
||||
if (decompress_state[j] != nullptr) {
|
||||
decompress_done(decompress_state[j]);
|
||||
}
|
||||
decompress_state[j] = nullptr;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user