X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fsp5xdec.c;h=a1b43f8f80f001ede5f605aca4368145a5eea6bf;hb=a247ac640df3da573cd661065bf53f37863e2b46;hp=815f9ad50ea4a896c537dd4d571b37a8792890dd;hpb=e427ba5c68a522b26a45bf7c61016d9349fab43d;p=ffmpeg diff --git a/libavcodec/sp5xdec.c b/libavcodec/sp5xdec.c index 815f9ad50ea..a1b43f8f80f 100644 --- a/libavcodec/sp5xdec.c +++ b/libavcodec/sp5xdec.c @@ -30,32 +30,29 @@ #include "mjpegdec.h" #include "sp5x.h" - -static int sp5x_decode_frame(AVCodecContext *avctx, - void *data, int *got_frame, - AVPacket *avpkt) +int ff_sp5x_process_packet(AVCodecContext *avctx, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; - AVPacket avpkt_recoded; - const int qscale = 5; + AVBufferRef *buf_recoded; uint8_t *recoded; int i = 0, j = 0; if (!avctx->width || !avctx->height) return -1; - recoded = av_mallocz(buf_size + 1024); - if (!recoded) + buf_recoded = av_buffer_allocz(buf_size + 1024); + if (!buf_recoded) return -1; + recoded = buf_recoded->data; /* SOI */ recoded[j++] = 0xFF; recoded[j++] = 0xD8; memcpy(recoded+j, &sp5x_data_dqt[0], sizeof(sp5x_data_dqt)); - memcpy(recoded+j+5, &sp5x_quant_table[qscale * 2], 64); - memcpy(recoded+j+70, &sp5x_quant_table[(qscale * 2) + 1], 64); + memcpy(recoded + j + 5, &sp5x_qscale_five_quant_table[0], 64); + memcpy(recoded + j + 70, &sp5x_qscale_five_quant_table[1], 64); j += sizeof(sp5x_data_dqt); memcpy(recoded+j, &sp5x_data_dht[0], sizeof(sp5x_data_dht)); @@ -84,18 +81,16 @@ static int sp5x_decode_frame(AVCodecContext *avctx, recoded[j++] = 0xFF; recoded[j++] = 0xD9; - av_init_packet(&avpkt_recoded); - avpkt_recoded.data = recoded; - avpkt_recoded.size = j; - i = ff_mjpeg_decode_frame(avctx, data, got_frame, &avpkt_recoded); - - av_free(recoded); + av_buffer_unref(&avpkt->buf); + avpkt->buf = buf_recoded; + avpkt->data = recoded; + avpkt->size = j; - return i < 0 ? i : avpkt->size; + return 0; } #if CONFIG_SP5X_DECODER -AVCodec ff_sp5x_decoder = { +const AVCodec ff_sp5x_decoder = { .name = "sp5x", .long_name = NULL_IF_CONFIG_SMALL("Sunplus JPEG (SP5X)"), .type = AVMEDIA_TYPE_VIDEO, @@ -103,14 +98,15 @@ AVCodec ff_sp5x_decoder = { .priv_data_size = sizeof(MJpegDecodeContext), .init = ff_mjpeg_decode_init, .close = ff_mjpeg_decode_end, - .decode = sp5x_decode_frame, + .receive_frame = ff_mjpeg_receive_frame, .capabilities = AV_CODEC_CAP_DR1, .max_lowres = 3, - .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP | + FF_CODEC_CAP_SETS_PKT_DTS, }; #endif #if CONFIG_AMV_DECODER -AVCodec ff_amv_decoder = { +const AVCodec ff_amv_decoder = { .name = "amv", .long_name = NULL_IF_CONFIG_SMALL("AMV Video"), .type = AVMEDIA_TYPE_VIDEO, @@ -118,9 +114,10 @@ AVCodec ff_amv_decoder = { .priv_data_size = sizeof(MJpegDecodeContext), .init = ff_mjpeg_decode_init, .close = ff_mjpeg_decode_end, - .decode = sp5x_decode_frame, + .receive_frame = ff_mjpeg_receive_frame, .max_lowres = 3, .capabilities = AV_CODEC_CAP_DR1, - .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP | + FF_CODEC_CAP_SETS_PKT_DTS, }; #endif