mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Add support for VP60 and VP61.
Originally committed as revision 7329 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
95cefcb4ed
commit
9110a0e32d
@ -968,7 +968,7 @@ following image formats are supported:
|
|||||||
@item Sorenson Video 3 @tab @tab X @tab fourcc: SVQ3
|
@item Sorenson Video 3 @tab @tab X @tab fourcc: SVQ3
|
||||||
@item On2 VP3 @tab @tab X @tab still experimental
|
@item On2 VP3 @tab @tab X @tab still experimental
|
||||||
@item On2 VP5 @tab @tab X @tab fourcc: VP50
|
@item On2 VP5 @tab @tab X @tab fourcc: VP50
|
||||||
@item On2 VP6 @tab @tab X @tab fourcc: VP62
|
@item On2 VP6 @tab @tab X @tab fourcc: VP60,VP61,VP62
|
||||||
@item Theora @tab @tab X @tab still experimental
|
@item Theora @tab @tab X @tab still experimental
|
||||||
@item Intel Indeo 3 @tab @tab X
|
@item Intel Indeo 3 @tab @tab X
|
||||||
@item FLV @tab X @tab X @tab Sorenson H.263 used in Flash
|
@item FLV @tab X @tab X @tab Sorenson H.263 used in Flash
|
||||||
|
@ -37,8 +37,8 @@ extern "C" {
|
|||||||
#define AV_STRINGIFY(s) AV_TOSTRING(s)
|
#define AV_STRINGIFY(s) AV_TOSTRING(s)
|
||||||
#define AV_TOSTRING(s) #s
|
#define AV_TOSTRING(s) #s
|
||||||
|
|
||||||
#define LIBAVCODEC_VERSION_INT ((51<<16)+(26<<8)+0)
|
#define LIBAVCODEC_VERSION_INT ((51<<16)+(27<<8)+0)
|
||||||
#define LIBAVCODEC_VERSION 51.26.0
|
#define LIBAVCODEC_VERSION 51.27.0
|
||||||
#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT
|
#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT
|
||||||
|
|
||||||
#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION)
|
#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION)
|
||||||
|
@ -76,6 +76,7 @@ struct vp56_context {
|
|||||||
uint8_t *edge_emu_buffer_alloc;
|
uint8_t *edge_emu_buffer_alloc;
|
||||||
uint8_t *edge_emu_buffer;
|
uint8_t *edge_emu_buffer;
|
||||||
vp56_range_coder_t c;
|
vp56_range_coder_t c;
|
||||||
|
int sub_version;
|
||||||
|
|
||||||
/* frame info */
|
/* frame info */
|
||||||
int plane_width[3];
|
int plane_width[3];
|
||||||
|
@ -42,7 +42,9 @@ static int vp6_parse_header(vp56_context_t *s, uint8_t *buf, int buf_size,
|
|||||||
int *golden_frame)
|
int *golden_frame)
|
||||||
{
|
{
|
||||||
vp56_range_coder_t *c = &s->c;
|
vp56_range_coder_t *c = &s->c;
|
||||||
int parse_filter_info;
|
int parse_filter_info = 0;
|
||||||
|
int vrt_shift = 0;
|
||||||
|
int sub_version;
|
||||||
int rows, cols;
|
int rows, cols;
|
||||||
int res = 1;
|
int res = 1;
|
||||||
|
|
||||||
@ -53,7 +55,10 @@ static int vp6_parse_header(vp56_context_t *s, uint8_t *buf, int buf_size,
|
|||||||
vp56_init_dequant(s, (buf[0] >> 1) & 0x3F);
|
vp56_init_dequant(s, (buf[0] >> 1) & 0x3F);
|
||||||
|
|
||||||
if (s->frames[VP56_FRAME_CURRENT].key_frame) {
|
if (s->frames[VP56_FRAME_CURRENT].key_frame) {
|
||||||
if ((buf[1] & 0xFE) != 0x46) /* would be 0x36 for VP61 */
|
sub_version = buf[1] >> 3;
|
||||||
|
if (sub_version > 8)
|
||||||
|
return 0;
|
||||||
|
if ((buf[1] & 0x06) != 0x06)
|
||||||
return 0;
|
return 0;
|
||||||
if (buf[1] & 1) {
|
if (buf[1] & 1) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "interlacing not supported\n");
|
av_log(s->avctx, AV_LOG_ERROR, "interlacing not supported\n");
|
||||||
@ -79,27 +84,37 @@ static int vp6_parse_header(vp56_context_t *s, uint8_t *buf, int buf_size,
|
|||||||
vp56_rac_gets(c, 2);
|
vp56_rac_gets(c, 2);
|
||||||
|
|
||||||
parse_filter_info = 1;
|
parse_filter_info = 1;
|
||||||
|
if (sub_version < 8)
|
||||||
|
vrt_shift = 5;
|
||||||
|
s->sub_version = sub_version;
|
||||||
} else {
|
} else {
|
||||||
|
if (!s->sub_version)
|
||||||
|
return 0;
|
||||||
|
|
||||||
vp56_init_range_decoder(c, buf+1, buf_size-1);
|
vp56_init_range_decoder(c, buf+1, buf_size-1);
|
||||||
|
|
||||||
*golden_frame = vp56_rac_get(c);
|
*golden_frame = vp56_rac_get(c);
|
||||||
s->deblock_filtering = vp56_rac_get(c);
|
s->deblock_filtering = vp56_rac_get(c);
|
||||||
if (s->deblock_filtering)
|
if (s->deblock_filtering)
|
||||||
vp56_rac_get(c);
|
vp56_rac_get(c);
|
||||||
parse_filter_info = vp56_rac_get(c);
|
if (s->sub_version > 7)
|
||||||
|
parse_filter_info = vp56_rac_get(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parse_filter_info) {
|
if (parse_filter_info) {
|
||||||
if (vp56_rac_get(c)) {
|
if (vp56_rac_get(c)) {
|
||||||
s->filter_mode = 2;
|
s->filter_mode = 2;
|
||||||
s->sample_variance_threshold = vp56_rac_gets(c, 5);
|
s->sample_variance_threshold = vp56_rac_gets(c, 5) << vrt_shift;
|
||||||
s->max_vector_length = 2 << vp56_rac_gets(c, 3);
|
s->max_vector_length = 2 << vp56_rac_gets(c, 3);
|
||||||
} else if (vp56_rac_get(c)) {
|
} else if (vp56_rac_get(c)) {
|
||||||
s->filter_mode = 1;
|
s->filter_mode = 1;
|
||||||
} else {
|
} else {
|
||||||
s->filter_mode = 0;
|
s->filter_mode = 0;
|
||||||
}
|
}
|
||||||
s->filter_selection = vp56_rac_gets(c, 4);
|
if (s->sub_version > 7)
|
||||||
|
s->filter_selection = vp56_rac_gets(c, 4);
|
||||||
|
else
|
||||||
|
s->filter_selection = 16;
|
||||||
}
|
}
|
||||||
|
|
||||||
vp56_rac_get(c);
|
vp56_rac_get(c);
|
||||||
@ -439,8 +454,8 @@ static void vp6_filter(vp56_context_t *s, uint8_t *dst, uint8_t *src,
|
|||||||
(FFABS(mv.x) > s->max_vector_length ||
|
(FFABS(mv.x) > s->max_vector_length ||
|
||||||
FFABS(mv.y) > s->max_vector_length)) {
|
FFABS(mv.y) > s->max_vector_length)) {
|
||||||
filter4 = 0;
|
filter4 = 0;
|
||||||
} else if (!s->sample_variance_threshold
|
} else if (s->sample_variance_threshold
|
||||||
|| (vp6_block_variance(src+offset1, stride)
|
&& (vp6_block_variance(src+offset1, stride)
|
||||||
< s->sample_variance_threshold)) {
|
< s->sample_variance_threshold)) {
|
||||||
filter4 = 0;
|
filter4 = 0;
|
||||||
}
|
}
|
||||||
|
@ -144,7 +144,7 @@ static const uint8_t vp6_coeff_groups[] = {
|
|||||||
5, 5, 5, 5, 5, 5, 5, 5,
|
5, 5, 5, 5, 5, 5, 5, 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int16_t vp6_block_copy_filter[16][8][4] = {
|
static const int16_t vp6_block_copy_filter[17][8][4] = {
|
||||||
{ { 0, 128, 0, 0 }, /* 0 */
|
{ { 0, 128, 0, 0 }, /* 0 */
|
||||||
{ -3, 122, 9, 0 },
|
{ -3, 122, 9, 0 },
|
||||||
{ -4, 109, 24, -1 },
|
{ -4, 109, 24, -1 },
|
||||||
@ -273,6 +273,14 @@ static const int16_t vp6_block_copy_filter[16][8][4] = {
|
|||||||
{ -11, 59, 99, -19 },
|
{ -11, 59, 99, -19 },
|
||||||
{ -6, 38, 114, -18 },
|
{ -6, 38, 114, -18 },
|
||||||
{ -2, 18, 124, -12 } },
|
{ -2, 18, 124, -12 } },
|
||||||
|
{ { 0, 128, 0, 0 }, /* 16 */
|
||||||
|
{ -4, 118, 16, -2 },
|
||||||
|
{ -7, 106, 34, -5 },
|
||||||
|
{ -8, 90, 53, -7 },
|
||||||
|
{ -8, 72, 72, -8 },
|
||||||
|
{ -7, 53, 90, -8 },
|
||||||
|
{ -5, 34, 106, -7 },
|
||||||
|
{ -2, 16, 118, -4 } },
|
||||||
};
|
};
|
||||||
|
|
||||||
static const vp56_tree_t vp6_pcr_tree[] = {
|
static const vp56_tree_t vp6_pcr_tree[] = {
|
||||||
|
@ -189,13 +189,13 @@ static const CodecTag nsv_codec_video_tags[] = {
|
|||||||
{ CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
|
{ CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
|
||||||
{ CODEC_ID_VP5, MKTAG('V', 'P', '5', ' ') },
|
{ CODEC_ID_VP5, MKTAG('V', 'P', '5', ' ') },
|
||||||
{ CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') },
|
{ CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') },
|
||||||
|
{ CODEC_ID_VP6, MKTAG('V', 'P', '6', ' ') },
|
||||||
|
{ CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') },
|
||||||
|
{ CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') },
|
||||||
{ CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') },
|
{ CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') },
|
||||||
/*
|
/*
|
||||||
{ CODEC_ID_VP4, MKTAG('V', 'P', '4', ' ') },
|
{ CODEC_ID_VP4, MKTAG('V', 'P', '4', ' ') },
|
||||||
{ CODEC_ID_VP4, MKTAG('V', 'P', '4', '0') },
|
{ CODEC_ID_VP4, MKTAG('V', 'P', '4', '0') },
|
||||||
{ CODEC_ID_VP6, MKTAG('V', 'P', '6', ' ') },
|
|
||||||
{ CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') },
|
|
||||||
{ CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') },
|
|
||||||
*/
|
*/
|
||||||
{ CODEC_ID_XVID, MKTAG('X', 'V', 'I', 'D') }, /* cf sample xvid decoder from nsv_codec_sdk.zip */
|
{ CODEC_ID_XVID, MKTAG('X', 'V', 'I', 'D') }, /* cf sample xvid decoder from nsv_codec_sdk.zip */
|
||||||
{ CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', '3') },
|
{ CODEC_ID_RAWVIDEO, MKTAG('R', 'G', 'B', '3') },
|
||||||
|
@ -118,6 +118,8 @@ const CodecTag codec_bmp_tags[] = {
|
|||||||
{ CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
|
{ CODEC_ID_VP3, MKTAG('V', 'P', '3', '1') },
|
||||||
{ CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') },
|
{ CODEC_ID_VP3, MKTAG('V', 'P', '3', '0') },
|
||||||
{ CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') },
|
{ CODEC_ID_VP5, MKTAG('V', 'P', '5', '0') },
|
||||||
|
{ CODEC_ID_VP6, MKTAG('V', 'P', '6', '0') },
|
||||||
|
{ CODEC_ID_VP6, MKTAG('V', 'P', '6', '1') },
|
||||||
{ CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') },
|
{ CODEC_ID_VP6, MKTAG('V', 'P', '6', '2') },
|
||||||
{ CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') },
|
{ CODEC_ID_ASV1, MKTAG('A', 'S', 'V', '1') },
|
||||||
{ CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') },
|
{ CODEC_ID_ASV2, MKTAG('A', 'S', 'V', '2') },
|
||||||
|
Loading…
Reference in New Issue
Block a user