X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fljpegenc.c;h=a73ef45500bcc30475c7f57c35513d5c75bcb451;hb=b6a6e90a7c79f9530637a1efb62e0af4049822c1;hp=7c9cde80bb8db1733a61317c96017c8a43358113;hpb=755bfeabccbba9ae1b565b11d645b8e4fe139fa8;p=ffmpeg diff --git a/libavcodec/ljpegenc.c b/libavcodec/ljpegenc.c index 7c9cde80bb8..a73ef45500b 100644 --- a/libavcodec/ljpegenc.c +++ b/libavcodec/ljpegenc.c @@ -1,62 +1,78 @@ /* * lossless JPEG encoder - * Copyright (c) 2000, 2001 Fabrice Bellard. + * Copyright (c) 2000, 2001 Fabrice Bellard * Copyright (c) 2003 Alex Beregszaszi * Copyright (c) 2003-2004 Michael Niedermayer * - * This file is part of FFmpeg. + * Support for external huffman table, various fixes (AVID workaround), + * aspecting, new decode_frame mechanism and apple mjpeg-b support + * by Alex Beregszaszi * - * FFmpeg is free software; you can redistribute it and/or + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * Support for external huffman table, various fixes (AVID workaround), - * aspecting, new decode_frame mechanism and apple mjpeg-b support - * by Alex Beregszaszi */ /** - * @file ljpegenc.c + * @file * lossless JPEG encoder. */ #include "avcodec.h" #include "dsputil.h" +#include "internal.h" #include "mpegvideo.h" #include "mjpeg.h" #include "mjpegenc.h" -static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data){ +static int encode_picture_lossless(AVCodecContext *avctx, AVPacket *pkt, + const AVFrame *pict, int *got_packet) +{ MpegEncContext * const s = avctx->priv_data; MJpegContext * const m = s->mjpeg_ctx; - AVFrame *pict = data; const int width= s->width; const int height= s->height; - AVFrame * const p= (AVFrame*)&s->current_picture; + AVFrame * const p = &s->current_picture.f; const int predictor= avctx->prediction_method+1; + const int mb_width = (width + s->mjpeg_hsample[0] - 1) / s->mjpeg_hsample[0]; + const int mb_height = (height + s->mjpeg_vsample[0] - 1) / s->mjpeg_vsample[0]; + int ret, max_pkt_size = FF_MIN_BUFFER_SIZE; + + if (avctx->pix_fmt == PIX_FMT_BGRA) + max_pkt_size += width * height * 3 * 4; + else { + max_pkt_size += mb_width * mb_height * 3 * 4 + * s->mjpeg_hsample[0] * s->mjpeg_vsample[0]; + } + if ((ret = ff_alloc_packet(pkt, max_pkt_size)) < 0) { + av_log(avctx, AV_LOG_ERROR, "Error getting output packet of size %d.\n", max_pkt_size); + return ret; + } - init_put_bits(&s->pb, buf, buf_size); + init_put_bits(&s->pb, pkt->data, pkt->size); *p = *pict; - p->pict_type= FF_I_TYPE; + p->pict_type= AV_PICTURE_TYPE_I; p->key_frame= 1; ff_mjpeg_encode_picture_header(s); s->header_bits= put_bits_count(&s->pb); - if(avctx->pix_fmt == PIX_FMT_RGB32){ + if(avctx->pix_fmt == PIX_FMT_BGRA){ int x, y, i; const int linesize= p->linesize[0]; uint16_t (*buffer)[4]= (void *) s->rd_scratchpad; @@ -104,8 +120,6 @@ static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, in } }else{ int mb_x, mb_y, i; - const int mb_width = (width + s->mjpeg_hsample[0] - 1) / s->mjpeg_hsample[0]; - const int mb_height = (height + s->mjpeg_vsample[0] - 1) / s->mjpeg_vsample[0]; for(mb_y = 0; mb_y < mb_height; mb_y++) { if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < mb_width * 4 * 3 * s->mjpeg_hsample[0] * s->mjpeg_vsample[0]){ @@ -141,9 +155,9 @@ static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, in } if(i==0) - ff_mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly + ff_mjpeg_encode_dc(s, *ptr - pred, m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly else - ff_mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_chrominance, m->huff_code_dc_chrominance); + ff_mjpeg_encode_dc(s, *ptr - pred, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance); } } } @@ -164,9 +178,9 @@ static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, in PREDICT(pred, ptr[-linesize-1], ptr[-linesize], ptr[-1], predictor); if(i==0) - ff_mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly + ff_mjpeg_encode_dc(s, *ptr - pred, m->huff_size_dc_luminance, m->huff_code_dc_luminance); //FIXME ugly else - ff_mjpeg_encode_dc(s, (int8_t)(*ptr - pred), m->huff_size_dc_chrominance, m->huff_code_dc_chrominance); + ff_mjpeg_encode_dc(s, *ptr - pred, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance); } } } @@ -181,17 +195,22 @@ static int encode_picture_lossless(AVCodecContext *avctx, unsigned char *buf, in s->picture_number++; flush_put_bits(&s->pb); - return pbBufPtr(&s->pb) - s->pb.buf; + pkt->size = put_bits_ptr(&s->pb) - s->pb.buf; + pkt->flags |= AV_PKT_FLAG_KEY; + *got_packet = 1; + + return 0; // return (put_bits_count(&f->pb)+7)/8; } -AVCodec ljpeg_encoder = { //FIXME avoid MPV_* lossless JPEG should not need them - "ljpeg", - CODEC_TYPE_VIDEO, - CODEC_ID_LJPEG, - sizeof(MpegEncContext), - MPV_encode_init, - encode_picture_lossless, - MPV_encode_end, +AVCodec ff_ljpeg_encoder = { //FIXME avoid MPV_* lossless JPEG should not need them + .name = "ljpeg", + .type = AVMEDIA_TYPE_VIDEO, + .id = CODEC_ID_LJPEG, + .priv_data_size = sizeof(MpegEncContext), + .init = ff_MPV_encode_init, + .encode2 = encode_picture_lossless, + .close = ff_MPV_encode_end, + .long_name = NULL_IF_CONFIG_SMALL("Lossless JPEG"), };