Skip to content

Commit 87fd8b4

Browse files
committed
Merge branch 'bugfix/jpeg_error_handle_v5.3' into 'release/v5.3'
fix(jpeg): Modify jpeg deocde/encode error handling logic (backport v5.3) See merge request espressif/esp-idf!31159
2 parents 9aea2d3 + fccc309 commit 87fd8b4

File tree

2 files changed

+35
-20
lines changed

2 files changed

+35
-20
lines changed

components/esp_driver_jpeg/jpeg_decode.c

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -217,12 +217,12 @@ esp_err_t jpeg_decoder_process(jpeg_decoder_handle_t decoder_engine, const jpeg_
217217
decoder_engine->conv_std = decode_cfg->conv_std;
218218
decoder_engine->decoded_buf = decode_outbuf;
219219

220-
ESP_GOTO_ON_ERROR(jpeg_parse_marker(decoder_engine, bit_stream, stream_size), err, TAG, "jpeg parse marker failed");
221-
ESP_GOTO_ON_ERROR(jpeg_parse_header_info_to_hw(decoder_engine), err, TAG, "write header info to hw failed");
222-
ESP_GOTO_ON_ERROR(jpeg_dec_config_dma_descriptor(decoder_engine), err, TAG, "config dma descriptor failed");
220+
ESP_GOTO_ON_ERROR(jpeg_parse_marker(decoder_engine, bit_stream, stream_size), err2, TAG, "jpeg parse marker failed");
221+
ESP_GOTO_ON_ERROR(jpeg_parse_header_info_to_hw(decoder_engine), err2, TAG, "write header info to hw failed");
222+
ESP_GOTO_ON_ERROR(jpeg_dec_config_dma_descriptor(decoder_engine), err2, TAG, "config dma descriptor failed");
223223

224224
*out_size = decoder_engine->header_info->process_h * decoder_engine->header_info->process_v * decoder_engine->bit_per_pixel / 8;
225-
ESP_GOTO_ON_FALSE((*out_size <= outbuf_size), ESP_ERR_INVALID_ARG, err, TAG, "Given buffer size % " PRId32 " is smaller than actual jpeg decode output size % " PRId32 "the height and width of output picture size will be adjusted to 16 bytes aligned automatically", outbuf_size, *out_size);
225+
ESP_GOTO_ON_FALSE((*out_size <= outbuf_size), ESP_ERR_INVALID_ARG, err2, TAG, "Given buffer size % " PRId32 " is smaller than actual jpeg decode output size % " PRId32 "the height and width of output picture size will be adjusted to 16 bytes aligned automatically", outbuf_size, *out_size);
226226

227227
dma2d_trans_config_t trans_desc = {
228228
.tx_channel_num = 1,
@@ -236,21 +236,20 @@ esp_err_t jpeg_decoder_process(jpeg_decoder_handle_t decoder_engine, const jpeg_
236236
ret = esp_cache_msync((void*)decoder_engine->header_info->buffer_offset, decoder_engine->header_info->buffer_left, ESP_CACHE_MSYNC_FLAG_DIR_C2M | ESP_CACHE_MSYNC_FLAG_UNALIGNED);
237237
assert(ret == ESP_OK);
238238

239-
ESP_GOTO_ON_ERROR(dma2d_enqueue(decoder_engine->dma2d_group_handle, &trans_desc, decoder_engine->trans_desc), err, TAG, "enqueue dma2d failed");
239+
ESP_GOTO_ON_ERROR(dma2d_enqueue(decoder_engine->dma2d_group_handle, &trans_desc, decoder_engine->trans_desc), err2, TAG, "enqueue dma2d failed");
240240
bool need_yield;
241241
// Blocking for JPEG decode transaction finishes.
242242
while (1) {
243243
jpeg_dma2d_dec_evt_t jpeg_dma2d_event;
244244
BaseType_t ret_val = xQueueReceive(decoder_engine->evt_queue, &jpeg_dma2d_event, decoder_engine->timeout_tick);
245-
ESP_GOTO_ON_FALSE(ret_val == pdTRUE, ESP_ERR_TIMEOUT, err, TAG, "jpeg-dma2d handle jpeg decode timeout, please check `timeout_ms` ");
245+
ESP_GOTO_ON_FALSE(ret_val == pdTRUE, ESP_ERR_TIMEOUT, err1, TAG, "jpeg-dma2d handle jpeg decode timeout, please check image accuracy and `timeout_ms` ");
246246

247247
// Dealing with JPEG event
248248
if (jpeg_dma2d_event.jpgd_status != 0) {
249249
uint32_t status = jpeg_dma2d_event.jpgd_status;
250250
s_decoder_error_log_print(status);
251-
dma2d_force_end(decoder_engine->trans_desc, &need_yield);
252-
xSemaphoreGive(decoder_engine->codec_base->codec_mutex);
253-
return ESP_ERR_INVALID_STATE;
251+
ret = ESP_ERR_INVALID_STATE;
252+
goto err1;
254253
}
255254

256255
if (jpeg_dma2d_event.dma_evt & JPEG_DMA2D_RX_EOF) {
@@ -260,11 +259,19 @@ esp_err_t jpeg_decoder_process(jpeg_decoder_handle_t decoder_engine, const jpeg_
260259
}
261260
}
262261

263-
err:
264262
xSemaphoreGive(decoder_engine->codec_base->codec_mutex);
265263
if (decoder_engine->codec_base->pm_lock) {
266264
ESP_RETURN_ON_ERROR(esp_pm_lock_release(decoder_engine->codec_base->pm_lock), TAG, "release pm_lock failed");
267265
}
266+
return ESP_OK;
267+
268+
err1:
269+
dma2d_force_end(decoder_engine->trans_desc, &need_yield);
270+
err2:
271+
xSemaphoreGive(decoder_engine->codec_base->codec_mutex);
272+
if (decoder_engine->codec_base->pm_lock) {
273+
esp_pm_lock_release(decoder_engine->codec_base->pm_lock);
274+
}
268275
return ret;
269276
}
270277

components/esp_driver_jpeg/jpeg_encode.c

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ esp_err_t jpeg_encoder_process(jpeg_encoder_handle_t encoder_engine, const jpeg_
186186
default:
187187
ESP_LOGE(TAG, "wrong, we don't support encode from such format.");
188188
ret = ESP_ERR_NOT_SUPPORTED;
189-
goto err;
189+
goto err2;
190190
}
191191
encoder_engine->header_info->sub_sample = encode_cfg->sub_sample;
192192
encoder_engine->header_info->quality = encode_cfg->image_quality;
@@ -202,7 +202,7 @@ esp_err_t jpeg_encoder_process(jpeg_encoder_handle_t encoder_engine, const jpeg_
202202
jpeg_ll_add_tail(hal->dev, true);
203203
jpeg_ll_enable_ff_check(hal->dev, true);
204204
jpeg_ll_set_qnr_presition(hal->dev, 0);
205-
ESP_GOTO_ON_ERROR(s_jpeg_set_header_info(encoder_engine), err, TAG, "set header failed");
205+
ESP_GOTO_ON_ERROR(s_jpeg_set_header_info(encoder_engine), err2, TAG, "set header failed");
206206
jpeg_hal_set_quantization_coefficient(hal, encoder_engine->header_info->m_quantization_tables[0], encoder_engine->header_info->m_quantization_tables[1]);
207207

208208
uint8_t sample_method_idx = 0;
@@ -227,7 +227,7 @@ esp_err_t jpeg_encoder_process(jpeg_encoder_handle_t encoder_engine, const jpeg_
227227
uint32_t dma_hb = enc_hb_tbl[best_hb_idx][sample_method_idx];
228228
uint32_t dma_vb = encoder_engine->mcuy;
229229

230-
ESP_GOTO_ON_FALSE((encoder_engine->header_info->header_len % cache_hal_get_cache_line_size(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_DATA)) == 0, ESP_ERR_INVALID_STATE, err, TAG, "The header is not cache line aligned, please check");
230+
ESP_GOTO_ON_FALSE((encoder_engine->header_info->header_len % cache_hal_get_cache_line_size(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_DATA)) == 0, ESP_ERR_INVALID_STATE, err2, TAG, "The header is not cache line aligned, please check");
231231

232232
// 1D direction
233233
memset(encoder_engine->rxlink, 0, sizeof(dma2d_descriptor_t));
@@ -248,36 +248,44 @@ esp_err_t jpeg_encoder_process(jpeg_encoder_handle_t encoder_engine, const jpeg_
248248
.on_job_picked = s_jpeg_enc_transaction_on_job_picked,
249249
};
250250

251-
ESP_GOTO_ON_ERROR(dma2d_enqueue(encoder_engine->dma2d_group_handle, &trans_desc, encoder_engine->trans_desc), err, TAG, "DMA2D enqueue failed");
252-
251+
ESP_GOTO_ON_ERROR(dma2d_enqueue(encoder_engine->dma2d_group_handle, &trans_desc, encoder_engine->trans_desc), err2, TAG, "DMA2D enqueue failed");
252+
bool need_yield;
253253
while (1) {
254254
jpeg_enc_dma2d_evt_t s_rcv_event;
255255
BaseType_t ret_val = xQueueReceive(encoder_engine->evt_queue, &s_rcv_event, encoder_engine->timeout_tick);
256-
ESP_GOTO_ON_FALSE(ret_val == pdTRUE, ESP_ERR_TIMEOUT, err, TAG, "jpeg-dma2d handle jpeg decode timeout, please check `timeout_ms`");
256+
ESP_GOTO_ON_FALSE(ret_val == pdTRUE, ESP_ERR_TIMEOUT, err1, TAG, "jpeg-dma2d handle jpeg decode timeout, please check image accuracy and `timeout_ms`");
257257

258258
if (s_rcv_event.encoder_status != 0) {
259259
s_encoder_error_log_print(s_rcv_event.encoder_status);
260260
ret = ESP_ERR_INVALID_STATE;
261-
goto err;
261+
goto err1;
262262
}
263263

264264
if (s_rcv_event.dma_evt & JPEG_DMA2D_RX_EOF) {
265-
ESP_GOTO_ON_ERROR(esp_cache_msync((void*)encoder_engine->rxlink, encoder_engine->dma_desc_size, ESP_CACHE_MSYNC_FLAG_DIR_M2C), err, TAG, "sync memory to cache failed");
265+
ESP_GOTO_ON_ERROR(esp_cache_msync((void*)encoder_engine->rxlink, encoder_engine->dma_desc_size, ESP_CACHE_MSYNC_FLAG_DIR_M2C), err1, TAG, "sync memory to cache failed");
266266
compressed_size = s_dma_desc_get_len(encoder_engine->rxlink);
267267
uint32_t _compressed_size = JPEG_ALIGN_UP(compressed_size, cache_hal_get_cache_line_size(CACHE_LL_LEVEL_EXT_MEM, CACHE_TYPE_DATA));
268-
ESP_GOTO_ON_ERROR(esp_cache_msync((void*)(bit_stream + encoder_engine->header_info->header_len), _compressed_size, ESP_CACHE_MSYNC_FLAG_DIR_M2C), err, TAG, "sync memory to cache failed");
268+
ESP_GOTO_ON_ERROR(esp_cache_msync((void*)(bit_stream + encoder_engine->header_info->header_len), _compressed_size, ESP_CACHE_MSYNC_FLAG_DIR_M2C), err1, TAG, "sync memory to cache failed");
269269
break;
270270
}
271271
}
272272

273273
compressed_size += encoder_engine->header_info->header_len;
274274
*out_size = compressed_size;
275275

276-
err:
277276
xSemaphoreGive(encoder_engine->codec_base->codec_mutex);
278277
if (encoder_engine->codec_base->pm_lock) {
279278
ESP_RETURN_ON_ERROR(esp_pm_lock_release(encoder_engine->codec_base->pm_lock), TAG, "release pm_lock failed");
280279
}
280+
return ESP_OK;
281+
282+
err1:
283+
dma2d_force_end(encoder_engine->trans_desc, &need_yield);
284+
err2:
285+
xSemaphoreGive(encoder_engine->codec_base->codec_mutex);
286+
if (encoder_engine->codec_base->pm_lock) {
287+
esp_pm_lock_release(encoder_engine->codec_base->pm_lock);
288+
}
281289
return ret;
282290
}
283291

0 commit comments

Comments
 (0)