mirror of
https://gitee.com/openharmony/third_party_ffmpeg
synced 2024-11-23 19:30:05 +00:00
dfa: support decoding version=1.0
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
1cb02d4fbc
commit
1557f34b10
@ -340,6 +340,7 @@ static int dfa_decode_frame(AVCodecContext *avctx,
|
|||||||
uint8_t *dst;
|
uint8_t *dst;
|
||||||
int ret;
|
int ret;
|
||||||
int i, pal_elems;
|
int i, pal_elems;
|
||||||
|
int version = avctx->extradata_size==2 ? AV_RL16(avctx->extradata) : 0;
|
||||||
|
|
||||||
if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
|
if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -374,9 +375,17 @@ static int dfa_decode_frame(AVCodecContext *avctx,
|
|||||||
buf = s->frame_buf;
|
buf = s->frame_buf;
|
||||||
dst = frame->data[0];
|
dst = frame->data[0];
|
||||||
for (i = 0; i < avctx->height; i++) {
|
for (i = 0; i < avctx->height; i++) {
|
||||||
memcpy(dst, buf, avctx->width);
|
if(version == 0x100) {
|
||||||
|
int j;
|
||||||
|
for(j = 0; j < avctx->width; j++) {
|
||||||
|
dst[j] = buf[ (i&3)*(avctx->width /4) + (j/4) +
|
||||||
|
((j&3)*(avctx->height/4) + (i/4))*avctx->width];
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
memcpy(dst, buf, avctx->width);
|
||||||
|
buf += avctx->width;
|
||||||
|
}
|
||||||
dst += frame->linesize[0];
|
dst += frame->linesize[0];
|
||||||
buf += avctx->width;
|
|
||||||
}
|
}
|
||||||
memcpy(frame->data[1], s->pal, sizeof(s->pal));
|
memcpy(frame->data[1], s->pal, sizeof(s->pal));
|
||||||
|
|
||||||
|
@ -36,13 +36,15 @@ static int dfa_read_header(AVFormatContext *s)
|
|||||||
AVIOContext *pb = s->pb;
|
AVIOContext *pb = s->pb;
|
||||||
AVStream *st;
|
AVStream *st;
|
||||||
int frames;
|
int frames;
|
||||||
|
int version;
|
||||||
uint32_t mspf;
|
uint32_t mspf;
|
||||||
|
|
||||||
if (avio_rl32(pb) != MKTAG('D', 'F', 'I', 'A')) {
|
if (avio_rl32(pb) != MKTAG('D', 'F', 'I', 'A')) {
|
||||||
av_log(s, AV_LOG_ERROR, "Invalid magic for DFA\n");
|
av_log(s, AV_LOG_ERROR, "Invalid magic for DFA\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
avio_skip(pb, 2); // unused
|
|
||||||
|
version = avio_rl16(pb);
|
||||||
frames = avio_rl16(pb);
|
frames = avio_rl16(pb);
|
||||||
|
|
||||||
st = avformat_new_stream(s, NULL);
|
st = avformat_new_stream(s, NULL);
|
||||||
@ -62,6 +64,12 @@ static int dfa_read_header(AVFormatContext *s)
|
|||||||
avio_skip(pb, 128 - 16); // padding
|
avio_skip(pb, 128 - 16); // padding
|
||||||
st->duration = frames;
|
st->duration = frames;
|
||||||
|
|
||||||
|
st->codec->extradata = av_malloc(2);
|
||||||
|
st->codec->extradata_size = 2;
|
||||||
|
AV_WL16(st->codec->extradata, version);
|
||||||
|
if (version == 0x100)
|
||||||
|
st->sample_aspect_ratio = (AVRational){2, 1};
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user