Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
7d643914
Commit
7d643914
authored
Nov 30, 2011
by
Eli Friedman
Committed by
Paul B Mahol
Dec 01, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Escape 130 (RPL) decoder
parent
b50be4e3
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
310 additions
and
0 deletions
+310
-0
Makefile
libavcodec/Makefile
+1
-0
allcodecs.c
libavcodec/allcodecs.c
+1
-0
avcodec.h
libavcodec/avcodec.h
+1
-0
escape130.c
libavcodec/escape130.c
+307
-0
No files found.
libavcodec/Makefile
View file @
7d643914
...
...
@@ -150,6 +150,7 @@ OBJS-$(CONFIG_EIGHTSVX_EXP_DECODER) += 8svx.o
OBJS-$(CONFIG_EIGHTSVX_FIB_DECODER)
+=
8svx.o
OBJS-$(CONFIG_EIGHTSVX_RAW_DECODER)
+=
8svx.o
OBJS-$(CONFIG_ESCAPE124_DECODER)
+=
escape124.o
OBJS-$(CONFIG_ESCAPE130_DECODER)
+=
escape130.o
OBJS-$(CONFIG_FFV1_DECODER)
+=
ffv1.o
rangecoder.o
OBJS-$(CONFIG_FFV1_ENCODER)
+=
ffv1.o
rangecoder.o
OBJS-$(CONFIG_FFVHUFF_DECODER)
+=
huffyuv.o
...
...
libavcodec/allcodecs.c
View file @
7d643914
...
...
@@ -108,6 +108,7 @@ void avcodec_register_all(void)
REGISTER_DECODER
(
EIGHTSVX_EXP
,
eightsvx_exp
);
REGISTER_DECODER
(
EIGHTSVX_FIB
,
eightsvx_fib
);
REGISTER_DECODER
(
ESCAPE124
,
escape124
);
REGISTER_DECODER
(
ESCAPE130
,
escape130
);
REGISTER_ENCDEC
(
FFV1
,
ffv1
);
REGISTER_ENCDEC
(
FFVHUFF
,
ffvhuff
);
REGISTER_ENCDEC
(
FLASHSV
,
flashsv
);
...
...
libavcodec/avcodec.h
View file @
7d643914
...
...
@@ -209,6 +209,7 @@ enum CodecID {
CODEC_ID_8SVX_FIB
,
#endif
CODEC_ID_ESCAPE124
,
CODEC_ID_ESCAPE130
,
CODEC_ID_DIRAC
,
CODEC_ID_BFI
,
CODEC_ID_CMV
,
...
...
libavcodec/escape130.c
0 → 100644
View file @
7d643914
/*
* Escape 130 Video Decoder
* Copyright (C) 2008 Eli Friedman (eli.friedman <at> gmail.com)
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "avcodec.h"
#define ALT_BITSTREAM_READER_LE
#include "bitstream.h"
typedef
struct
Escape130Context
{
AVFrame
frame
;
}
Escape130Context
;
static
int
can_safely_read
(
GetBitContext
*
gb
,
int
bits
)
{
return
get_bits_count
(
gb
)
+
bits
<=
gb
->
size_in_bits
;
}
/**
* Initialize the decoder
* @param avctx decoder context
* @return 0 success, negative on error
*/
static
av_cold
int
escape130_decode_init
(
AVCodecContext
*
avctx
)
{
avctx
->
pix_fmt
=
PIX_FMT_YUV420P
;
return
0
;
}
static
av_cold
int
escape130_decode_close
(
AVCodecContext
*
avctx
)
{
Escape130Context
*
s
=
avctx
->
priv_data
;
if
(
s
->
frame
.
data
[
0
])
avctx
->
release_buffer
(
avctx
,
&
s
->
frame
);
return
0
;
}
static
unsigned
decode_skip_count
(
GetBitContext
*
gb
)
{
unsigned
value
;
// This function reads a maximum of 27 bits,
// which is within the padding space
if
(
!
can_safely_read
(
gb
,
1
))
return
-
1
;
value
=
get_bits1
(
gb
);
if
(
value
)
return
0
;
value
=
get_bits
(
gb
,
3
);
if
(
value
)
return
value
;
value
=
get_bits
(
gb
,
8
);
if
(
value
)
return
value
+
7
;
value
=
get_bits
(
gb
,
15
);
if
(
value
)
return
value
+
262
;
return
-
1
;
}
/**
* Decode a single frame
* @param avctx decoder context
* @param data decoded frame
* @param data_size size of the decoded frame
* @param buf input buffer
* @param buf_size input buffer size
* @return 0 success, -1 on error
*/
static
int
escape130_decode_frame
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
data_size
,
const
uint8_t
*
buf
,
int
buf_size
)
{
Escape130Context
*
s
=
avctx
->
priv_data
;
GetBitContext
gb
;
unsigned
i
;
uint8_t
*
old_y
,
*
old_cb
,
*
old_cr
,
*
new_y
,
*
new_cb
,
*
new_cr
;
unsigned
old_y_stride
,
old_cb_stride
,
old_cr_stride
,
new_y_stride
,
new_cb_stride
,
new_cr_stride
;
unsigned
total_blocks
=
avctx
->
width
*
avctx
->
height
/
4
,
block_index
,
row_index
=
0
;
unsigned
y
[
4
]
=
{
0
},
cb
=
16
,
cr
=
16
;
unsigned
skip
=
-
1
;
AVFrame
new_frame
=
{
{
0
}
};
init_get_bits
(
&
gb
,
buf
,
buf_size
*
8
);
if
(
!
can_safely_read
(
&
gb
,
128
))
return
-
1
;
// Header; no useful information in here
skip_bits_long
(
&
gb
,
128
);
new_frame
.
reference
=
3
;
if
(
avctx
->
get_buffer
(
avctx
,
&
new_frame
))
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"get_buffer() failed
\n
"
);
return
-
1
;
}
new_y
=
new_frame
.
data
[
0
];
new_cb
=
new_frame
.
data
[
1
];
new_cr
=
new_frame
.
data
[
2
];
new_y_stride
=
new_frame
.
linesize
[
0
];
new_cb_stride
=
new_frame
.
linesize
[
1
];
new_cr_stride
=
new_frame
.
linesize
[
2
];
old_y
=
s
->
frame
.
data
[
0
];
old_cb
=
s
->
frame
.
data
[
1
];
old_cr
=
s
->
frame
.
data
[
2
];
old_y_stride
=
s
->
frame
.
linesize
[
0
];
old_cb_stride
=
s
->
frame
.
linesize
[
1
];
old_cr_stride
=
s
->
frame
.
linesize
[
2
];
av_log
(
NULL
,
AV_LOG_DEBUG
,
"Strides: %i, %i
\n
"
,
new_y_stride
,
new_cb_stride
);
for
(
block_index
=
0
;
block_index
<
total_blocks
;
block_index
++
)
{
// Note that this call will make us skip the rest of the blocks
// if the frame prematurely ends
if
(
skip
==
-
1
)
skip
=
decode_skip_count
(
&
gb
);
if
(
skip
)
{
if
(
old_y
)
{
y
[
0
]
=
old_y
[
0
]
/
4
;
y
[
1
]
=
old_y
[
1
]
/
4
;
y
[
2
]
=
old_y
[
old_y_stride
]
/
4
;
y
[
3
]
=
old_y
[
old_y_stride
+
1
]
/
4
;
cb
=
old_cb
[
0
]
/
8
;
cr
=
old_cr
[
0
]
/
8
;
}
else
{
y
[
0
]
=
y
[
1
]
=
y
[
2
]
=
y
[
3
]
=
0
;
cb
=
cr
=
16
;
}
}
else
{
if
(
get_bits1
(
&
gb
))
{
unsigned
sign_selector
=
get_bits
(
&
gb
,
6
);
unsigned
difference_selector
=
get_bits
(
&
gb
,
2
);
unsigned
y_base
=
2
*
get_bits
(
&
gb
,
5
);
static
const
uint8_t
offset_table
[]
=
{
2
,
4
,
10
,
20
};
static
const
int8_t
sign_table
[
64
][
4
]
=
{
{
0
,
0
,
0
,
0
},
{
-
1
,
1
,
0
,
0
},
{
1
,
-
1
,
0
,
0
},
{
-
1
,
0
,
1
,
0
},
{
-
1
,
1
,
1
,
0
},
{
0
,
-
1
,
1
,
0
},
{
1
,
-
1
,
1
,
0
},
{
-
1
,
-
1
,
1
,
0
},
{
1
,
0
,
-
1
,
0
},
{
0
,
1
,
-
1
,
0
},
{
1
,
1
,
-
1
,
0
},
{
-
1
,
1
,
-
1
,
0
},
{
1
,
-
1
,
-
1
,
0
},
{
-
1
,
0
,
0
,
1
},
{
-
1
,
1
,
0
,
1
},
{
0
,
-
1
,
0
,
1
},
{
0
,
0
,
0
,
0
},
{
1
,
-
1
,
0
,
1
},
{
-
1
,
-
1
,
0
,
1
},
{
-
1
,
0
,
1
,
1
},
{
-
1
,
1
,
1
,
1
},
{
0
,
-
1
,
1
,
1
},
{
1
,
-
1
,
1
,
1
},
{
-
1
,
-
1
,
1
,
1
},
{
0
,
0
,
-
1
,
1
},
{
1
,
0
,
-
1
,
1
},
{
-
1
,
0
,
-
1
,
1
},
{
0
,
1
,
-
1
,
1
},
{
1
,
1
,
-
1
,
1
},
{
-
1
,
1
,
-
1
,
1
},
{
0
,
-
1
,
-
1
,
1
},
{
1
,
-
1
,
-
1
,
1
},
{
0
,
0
,
0
,
0
},
{
-
1
,
-
1
,
-
1
,
1
},
{
1
,
0
,
0
,
-
1
},
{
0
,
1
,
0
,
-
1
},
{
1
,
1
,
0
,
-
1
},
{
-
1
,
1
,
0
,
-
1
},
{
1
,
-
1
,
0
,
-
1
},
{
0
,
0
,
1
,
-
1
},
{
1
,
0
,
1
,
-
1
},
{
-
1
,
0
,
1
,
-
1
},
{
0
,
1
,
1
,
-
1
},
{
1
,
1
,
1
,
-
1
},
{
-
1
,
1
,
1
,
-
1
},
{
0
,
-
1
,
1
,
-
1
},
{
1
,
-
1
,
1
,
-
1
},
{
-
1
,
-
1
,
1
,
-
1
},
{
0
,
0
,
0
,
0
},
{
1
,
0
,
-
1
,
-
1
},
{
0
,
1
,
-
1
,
-
1
},
{
1
,
1
,
-
1
,
-
1
},
{
-
1
,
1
,
-
1
,
-
1
},
{
1
,
-
1
,
-
1
,
-
1
}
};
for
(
i
=
0
;
i
<
4
;
i
++
)
{
y
[
i
]
=
av_clip
(
y_base
+
offset_table
[
difference_selector
]
*
sign_table
[
sign_selector
][
i
],
0
,
63
);
}
}
else
if
(
get_bits1
(
&
gb
))
{
if
(
get_bits1
(
&
gb
))
{
unsigned
y_base
=
get_bits
(
&
gb
,
6
);
for
(
i
=
0
;
i
<
4
;
i
++
)
y
[
i
]
=
y_base
;
}
else
{
unsigned
adjust_index
=
get_bits
(
&
gb
,
3
);
static
const
int8_t
adjust
[]
=
{
-
4
,
-
3
,
-
2
,
-
1
,
1
,
2
,
3
,
4
};
for
(
i
=
0
;
i
<
4
;
i
++
)
y
[
i
]
=
av_clip
(
y
[
i
]
+
adjust
[
adjust_index
],
0
,
63
);
}
}
if
(
get_bits1
(
&
gb
))
{
if
(
get_bits1
(
&
gb
))
{
cb
=
get_bits
(
&
gb
,
5
);
cr
=
get_bits
(
&
gb
,
5
);
}
else
{
unsigned
adjust_index
=
get_bits
(
&
gb
,
3
);
static
const
int8_t
adjust
[
2
][
8
]
=
{
{
1
,
1
,
0
,
-
1
,
-
1
,
-
1
,
0
,
1
},
{
0
,
1
,
1
,
0
,
-
1
,
-
2
,
-
1
,
-
1
}
};
cb
=
(
cb
+
adjust
[
0
][
adjust_index
])
&
31
;
cr
=
(
cr
+
adjust
[
1
][
adjust_index
])
&
31
;
}
}
}
new_y
[
0
]
=
y
[
0
]
*
4
;
new_y
[
1
]
=
y
[
1
]
*
4
;
new_y
[
new_y_stride
]
=
y
[
2
]
*
4
;
new_y
[
new_y_stride
+
1
]
=
y
[
3
]
*
4
;
*
new_cb
=
cb
*
8
;
*
new_cr
=
cr
*
8
;
if
(
old_y
)
old_y
+=
2
,
old_cb
++
,
old_cr
++
;
new_y
+=
2
,
new_cb
++
,
new_cr
++
;
row_index
++
;
if
(
avctx
->
width
/
2
==
row_index
)
{
row_index
=
0
;
if
(
old_y
)
{
old_y
+=
old_y_stride
*
2
-
avctx
->
width
;
old_cb
+=
old_cb_stride
-
avctx
->
width
/
2
;
old_cr
+=
old_cr_stride
-
avctx
->
width
/
2
;
}
new_y
+=
new_y_stride
*
2
-
avctx
->
width
;
new_cb
+=
new_cb_stride
-
avctx
->
width
/
2
;
new_cr
+=
new_cr_stride
-
avctx
->
width
/
2
;
}
skip
--
;
}
av_log
(
NULL
,
AV_LOG_DEBUG
,
"Escape sizes: %i, %i
\n
"
,
buf_size
,
get_bits_count
(
&
gb
)
/
8
);
if
(
s
->
frame
.
data
[
0
])
avctx
->
release_buffer
(
avctx
,
&
s
->
frame
);
*
(
AVFrame
*
)
data
=
s
->
frame
=
new_frame
;
*
data_size
=
sizeof
(
AVFrame
);
return
buf_size
;
}
AVCodec
escape130_decoder
=
{
"escape130"
,
CODEC_TYPE_VIDEO
,
CODEC_ID_ESCAPE130
,
sizeof
(
Escape130Context
),
escape130_decode_init
,
NULL
,
escape130_decode_close
,
escape130_decode_frame
,
CODEC_CAP_DR1
,
};
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment