* Flash Screen Video encoder
* @author Alex Beregszaszi
* @author Benjamin Larsson
+ *
+ * A description of the bitstream format for Flash Screen Video version 1/2
+ * is part of the SWF File Format Specification (version 10), which can be
+ * downloaded from http://www.adobe.com/devnet/swf.html.
*/
-/* Bitstream description
- * The picture is divided into blocks that are zlib-compressed.
- *
- * The decoder is fed complete frames, the frameheader contains:
- * 4 bits of block width
- * 12 bits of frame width
- * 4 bits of block height
- * 12 bits of frame height
- *
- * Directly after the header are the compressed blocks. The blocks
- * have their compressed size represented with 16 bits in the beginning.
- * If the size = 0 then the block is unchanged from the previous frame.
- * All blocks are decompressed until the buffer is consumed.
- *
+/*
* Encoding ideas: A basic encoder would just use a fixed block size.
* Block sizes can be multiples of 16, from 16 to 256. The blocks don't
* have to be quadratic. A brute force search with a set of different
#include <zlib.h>
#include "avcodec.h"
+#include "internal.h"
#include "put_bits.h"
#include "bytestream.h"
bytestream_put_be16(&ptr, zsize);
buf_pos += zsize + 2;
- av_dlog(avctx, "buf_pos = %d\n", buf_pos);
+ av_dlog(s->avctx, "buf_pos = %d\n", buf_pos);
} else {
pred_blocks++;
bytestream_put_be16(&ptr, 0);
}
-static int flashsv_encode_frame(AVCodecContext *avctx, uint8_t *buf,
- int buf_size, void *data)
+static int flashsv_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
+ const AVFrame *pict, int *got_packet)
{
FlashSVContext * const s = avctx->priv_data;
- AVFrame *pict = data;
AVFrame * const p = &s->frame;
uint8_t *pfptr;
int res;
I_frame = 1;
}
- if (buf_size < s->image_width * s->image_height * 3) {
+ if ((res = ff_alloc_packet(pkt, s->image_width * s->image_height * 3)) < 0) {
//Conservative upper bound check for compressed data
- av_log(avctx, AV_LOG_ERROR, "buf_size %d < %d\n",
- buf_size, s->image_width * s->image_height * 3);
- return -1;
+ av_log(avctx, AV_LOG_ERROR, "Error getting output packet of size %d.\n",
+ s->image_width * s->image_height * 3);
+ return res;
}
- res = encode_bitstream(s, p, buf, buf_size, opt_w * 16, opt_h * 16,
- pfptr, &I_frame);
+ pkt->size = encode_bitstream(s, p, pkt->data, pkt->size, opt_w * 16, opt_h * 16,
+ pfptr, &I_frame);
//save the current frame
if (p->linesize[0] > 0)
avctx->coded_frame = p;
- return res;
+ if (p->key_frame)
+ pkt->flags |= AV_PKT_FLAG_KEY;
+ *got_packet = 1;
+
+ return 0;
}
static av_cold int flashsv_encode_end(AVCodecContext *avctx)
AVCodec ff_flashsv_encoder = {
.name = "flashsv",
.type = AVMEDIA_TYPE_VIDEO,
- .id = CODEC_ID_FLASHSV,
+ .id = AV_CODEC_ID_FLASHSV,
.priv_data_size = sizeof(FlashSVContext),
.init = flashsv_encode_init,
- .encode = flashsv_encode_frame,
+ .encode2 = flashsv_encode_frame,
.close = flashsv_encode_end,
- .pix_fmts = (const enum PixelFormat[]){PIX_FMT_BGR24, PIX_FMT_NONE},
+ .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_BGR24, AV_PIX_FMT_NONE },
.long_name = NULL_IF_CONFIG_SMALL("Flash Screen Video"),
};
-