1316 |
1316 |
return val;
|
1317 |
1317 |
}
|
1318 |
1318 |
|
1319 |
|
int ff_mjpeg_decode_frame(AVCodecContext *avctx,
|
1320 |
|
void *data, int *data_size,
|
1321 |
|
AVPacket *avpkt)
|
|
1319 |
int ff_mjpeg_find_marker(MJpegDecodeContext *s,
|
|
1320 |
const uint8_t **buf_ptr, const uint8_t *buf_end,
|
|
1321 |
const uint8_t **unescaped_buf_ptr, int *unescaped_buf_size)
|
1322 |
1322 |
{
|
1323 |
|
const uint8_t *buf = avpkt->data;
|
1324 |
|
int buf_size = avpkt->size;
|
1325 |
|
MJpegDecodeContext *s = avctx->priv_data;
|
1326 |
|
const uint8_t *buf_end, *buf_ptr;
|
1327 |
1323 |
int start_code;
|
1328 |
|
AVFrame *picture = data;
|
1329 |
|
|
1330 |
|
s->got_picture = 0; // picture from previous image can not be reused
|
1331 |
|
buf_ptr = buf;
|
1332 |
|
buf_end = buf + buf_size;
|
1333 |
|
while (buf_ptr < buf_end) {
|
1334 |
|
/* find start next marker */
|
1335 |
|
start_code = find_marker(&buf_ptr, buf_end);
|
1336 |
|
{
|
1337 |
|
/* EOF */
|
1338 |
|
if (start_code < 0) {
|
1339 |
|
goto the_end;
|
1340 |
|
} else {
|
1341 |
|
av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%td\n", start_code, buf_end - buf_ptr);
|
|
1324 |
start_code = find_marker(buf_ptr, buf_end);
|
1342 |
1325 |
|
1343 |
|
if ((buf_end - buf_ptr) > s->buffer_size)
|
|
1326 |
if ((buf_end - *buf_ptr) > s->buffer_size)
|
1344 |
1327 |
{
|
1345 |
1328 |
av_free(s->buffer);
|
1346 |
|
s->buffer_size = buf_end-buf_ptr;
|
|
1329 |
s->buffer_size = buf_end - *buf_ptr;
|
1347 |
1330 |
s->buffer = av_malloc(s->buffer_size + FF_INPUT_BUFFER_PADDING_SIZE);
|
1348 |
|
av_log(avctx, AV_LOG_DEBUG, "buffer too small, expanding to %d bytes\n",
|
|
1331 |
av_log(s->avctx, AV_LOG_DEBUG, "buffer too small, expanding to %d bytes\n",
|
1349 |
1332 |
s->buffer_size);
|
1350 |
1333 |
}
|
1351 |
1334 |
|
1352 |
1335 |
/* unescape buffer of SOS, use special treatment for JPEG-LS */
|
1353 |
1336 |
if (start_code == SOS && !s->ls)
|
1354 |
1337 |
{
|
1355 |
|
const uint8_t *src = buf_ptr;
|
|
1338 |
const uint8_t *src = *buf_ptr;
|
1356 |
1339 |
uint8_t *dst = s->buffer;
|
1357 |
1340 |
|
1358 |
1341 |
while (src<buf_end)
|
... | ... | |
1360 |
1343 |
uint8_t x = *(src++);
|
1361 |
1344 |
|
1362 |
1345 |
*(dst++) = x;
|
1363 |
|
if (avctx->codec_id != CODEC_ID_THP)
|
|
1346 |
if (s->avctx->codec_id != CODEC_ID_THP)
|
1364 |
1347 |
{
|
1365 |
1348 |
if (x == 0xff) {
|
1366 |
1349 |
while (src < buf_end && x == 0xff)
|
... | ... | |
1373 |
1356 |
}
|
1374 |
1357 |
}
|
1375 |
1358 |
}
|
1376 |
|
init_get_bits(&s->gb, s->buffer, (dst - s->buffer)*8);
|
|
1359 |
*unescaped_buf_ptr = s->buffer;
|
|
1360 |
*unescaped_buf_size = dst - s->buffer;
|
1377 |
1361 |
|
1378 |
|
av_log(avctx, AV_LOG_DEBUG, "escaping removed %td bytes\n",
|
1379 |
|
(buf_end - buf_ptr) - (dst - s->buffer));
|
|
1362 |
av_log(s->avctx, AV_LOG_DEBUG, "escaping removed %td bytes\n",
|
|
1363 |
(buf_end - *buf_ptr) - (dst - s->buffer));
|
1380 |
1364 |
}
|
1381 |
1365 |
else if(start_code == SOS && s->ls){
|
1382 |
|
const uint8_t *src = buf_ptr;
|
|
1366 |
const uint8_t *src = *buf_ptr;
|
1383 |
1367 |
uint8_t *dst = s->buffer;
|
1384 |
1368 |
int bit_count = 0;
|
1385 |
1369 |
int t = 0, b = 0;
|
... | ... | |
1415 |
1399 |
}
|
1416 |
1400 |
flush_put_bits(&pb);
|
1417 |
1401 |
|
1418 |
|
init_get_bits(&s->gb, dst, bit_count);
|
|
1402 |
*unescaped_buf_ptr = dst;
|
|
1403 |
*unescaped_buf_size = (bit_count + 7) >> 3;
|
1419 |
1404 |
}
|
1420 |
1405 |
else
|
1421 |
|
init_get_bits(&s->gb, buf_ptr, (buf_end - buf_ptr)*8);
|
|
1406 |
{
|
|
1407 |
*unescaped_buf_ptr = *buf_ptr;
|
|
1408 |
*unescaped_buf_size = buf_end - *buf_ptr;
|
|
1409 |
}
|
|
1410 |
|
|
1411 |
return start_code;
|
|
1412 |
}
|
|
1413 |
|
|
1414 |
int ff_mjpeg_decode_frame(AVCodecContext *avctx,
|
|
1415 |
void *data, int *data_size,
|
|
1416 |
AVPacket *avpkt)
|
|
1417 |
{
|
|
1418 |
const uint8_t *buf = avpkt->data;
|
|
1419 |
int buf_size = avpkt->size;
|
|
1420 |
MJpegDecodeContext *s = avctx->priv_data;
|
|
1421 |
const uint8_t *buf_end, *buf_ptr;
|
|
1422 |
const uint8_t *unescaped_buf_ptr;
|
|
1423 |
int unescaped_buf_size;
|
|
1424 |
int start_code;
|
|
1425 |
AVFrame *picture = data;
|
|
1426 |
|
|
1427 |
s->got_picture = 0; // picture from previous image can not be reused
|
|
1428 |
buf_ptr = buf;
|
|
1429 |
buf_end = buf + buf_size;
|
|
1430 |
while (buf_ptr < buf_end) {
|
|
1431 |
/* find start next marker */
|
|
1432 |
start_code = ff_mjpeg_find_marker(s, &buf_ptr, buf_end,
|
|
1433 |
&unescaped_buf_ptr, &unescaped_buf_size);
|
|
1434 |
{
|
|
1435 |
/* EOF */
|
|
1436 |
if (start_code < 0) {
|
|
1437 |
goto the_end;
|
|
1438 |
} else {
|
|
1439 |
av_log(avctx, AV_LOG_DEBUG, "marker=%x avail_size_in_buf=%td\n", start_code, buf_end - buf_ptr);
|
|
1440 |
|
|
1441 |
init_get_bits(&s->gb, unescaped_buf_ptr, unescaped_buf_size*8);
|
1422 |
1442 |
|
1423 |
1443 |
s->start_code = start_code;
|
1424 |
1444 |
if(s->avctx->debug & FF_DEBUG_STARTCODE){
|