1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

avcodec/magicyuvenc: write max huffman length and extradata too

Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
Paul B Mahol 2018-01-25 14:55:17 +01:00
parent 1f75756c71
commit 4d93c63e78

View File

@ -57,7 +57,6 @@ typedef struct MagicYUVContext {
int planes; int planes;
uint8_t format; uint8_t format;
AVFrame *p; AVFrame *p;
int max;
int slice_height; int slice_height;
int nb_slices; int nb_slices;
int correlate; int correlate;
@ -148,6 +147,7 @@ static void median_predict(MagicYUVContext *s,
static av_cold int magy_encode_init(AVCodecContext *avctx) static av_cold int magy_encode_init(AVCodecContext *avctx)
{ {
MagicYUVContext *s = avctx->priv_data; MagicYUVContext *s = avctx->priv_data;
PutByteContext pb;
int i; int i;
switch (avctx->pix_fmt) { switch (avctx->pix_fmt) {
@ -214,6 +214,34 @@ static av_cold int magy_encode_init(AVCodecContext *avctx)
case MEDIAN: s->predict = median_predict; break; 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; return 0;
} }
@ -347,7 +375,7 @@ static int encode_table(AVCodecContext *avctx, uint8_t *dst,
counts[i].value = 255 - i; counts[i].value = 255 - i;
} }
magy_huffman_compute_bits(counts, he, 256, 16); magy_huffman_compute_bits(counts, he, 256, 12);
calculate_codes(he); 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_init_writer(&pb, pkt->data, pkt->size);
bytestream2_put_le32(&pb, MKTAG('M', 'A', 'G', 'Y')); bytestream2_put_le32(&pb, MKTAG('M', 'A', 'G', 'Y'));
bytestream2_put_le32(&pb, 32); bytestream2_put_le32(&pb, 32); // header size
bytestream2_put_byte(&pb, 7); bytestream2_put_byte(&pb, 7); // version
bytestream2_put_byte(&pb, s->format); 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_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->width);
bytestream2_put_le32(&pb, avctx->height); bytestream2_put_le32(&pb, avctx->height);