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:
parent
1f75756c71
commit
4d93c63e78
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user