summaryrefslogtreecommitdiffstats
path: root/libavcodec/magicyuvenc.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2018-01-25 14:55:17 +0100
committerPaul B Mahol <onemda@gmail.com>2018-06-05 11:15:49 +0200
commit4d93c63e785d6a172be4b12360772d732eeb8980 (patch)
tree9cdc04891942769eec89cf3cb6a1e22ab855c97a /libavcodec/magicyuvenc.c
parent1f75756c719442280590b97bf17f3eed7d6aa93d (diff)
downloadffmpeg-streaming-4d93c63e785d6a172be4b12360772d732eeb8980.zip
ffmpeg-streaming-4d93c63e785d6a172be4b12360772d732eeb8980.tar.gz
avcodec/magicyuvenc: write max huffman length and extradata too
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavcodec/magicyuvenc.c')
-rw-r--r--libavcodec/magicyuvenc.c42
1 files changed, 37 insertions, 5 deletions
diff --git a/libavcodec/magicyuvenc.c b/libavcodec/magicyuvenc.c
index bbfb8d0..6b44c95 100644
--- a/libavcodec/magicyuvenc.c
+++ b/libavcodec/magicyuvenc.c
@@ -57,7 +57,6 @@ typedef struct MagicYUVContext {
int planes;
uint8_t format;
AVFrame *p;
- int max;
int slice_height;
int nb_slices;
int correlate;
@@ -148,6 +147,7 @@ static void median_predict(MagicYUVContext *s,
static av_cold int magy_encode_init(AVCodecContext *avctx)
{
MagicYUVContext *s = avctx->priv_data;
+ PutByteContext pb;
int i;
switch (avctx->pix_fmt) {
@@ -214,6 +214,34 @@ static av_cold int magy_encode_init(AVCodecContext *avctx)
case MEDIAN: s->predict = median_predict; break;
}
+ avctx->extradata_size = 32;
+
+ avctx->extradata = av_mallocz(avctx->extradata_size +
+ AV_INPUT_BUFFER_PADDING_SIZE);
+
+ if (!avctx->extradata) {
+ av_log(avctx, AV_LOG_ERROR, "Could not allocate extradata.\n");
+ return AVERROR(ENOMEM);
+ }
+
+ bytestream2_init_writer(&pb, avctx->extradata, avctx->extradata_size);
+ bytestream2_put_le32(&pb, MKTAG('M', 'A', 'G', 'Y'));
+ bytestream2_put_le32(&pb, 32);
+ bytestream2_put_byte(&pb, 7);
+ bytestream2_put_byte(&pb, s->format);
+ bytestream2_put_byte(&pb, 12);
+ bytestream2_put_byte(&pb, 0);
+
+ bytestream2_put_byte(&pb, 0);
+ bytestream2_put_byte(&pb, 0);
+ bytestream2_put_byte(&pb, 32);
+ bytestream2_put_byte(&pb, 0);
+
+ bytestream2_put_le32(&pb, avctx->width);
+ bytestream2_put_le32(&pb, avctx->height);
+ bytestream2_put_le32(&pb, avctx->width);
+ bytestream2_put_le32(&pb, avctx->height);
+
return 0;
}
@@ -347,7 +375,7 @@ static int encode_table(AVCodecContext *avctx, uint8_t *dst,
counts[i].value = 255 - i;
}
- magy_huffman_compute_bits(counts, he, 256, 16);
+ magy_huffman_compute_bits(counts, he, 256, 12);
calculate_codes(he);
@@ -407,12 +435,16 @@ static int magy_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
bytestream2_init_writer(&pb, pkt->data, pkt->size);
bytestream2_put_le32(&pb, MKTAG('M', 'A', 'G', 'Y'));
- bytestream2_put_le32(&pb, 32);
- bytestream2_put_byte(&pb, 7);
+ bytestream2_put_le32(&pb, 32); // header size
+ bytestream2_put_byte(&pb, 7); // version
bytestream2_put_byte(&pb, s->format);
+ bytestream2_put_byte(&pb, 12); // max huffman length
+ bytestream2_put_byte(&pb, 0);
+
bytestream2_put_byte(&pb, 0);
bytestream2_put_byte(&pb, 0);
- bytestream2_put_le32(&pb, 0);
+ bytestream2_put_byte(&pb, 32); // coder type
+ bytestream2_put_byte(&pb, 0);
bytestream2_put_le32(&pb, avctx->width);
bytestream2_put_le32(&pb, avctx->height);
OpenPOWER on IntegriCloud