avcodec/h261: Separate decode and encode contexts
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
parent
725e2300af
commit
d5e87df902
@ -60,7 +60,7 @@ static void h261_loop_filter(uint8_t *src, int stride)
|
|||||||
|
|
||||||
void ff_h261_loop_filter(MpegEncContext *s)
|
void ff_h261_loop_filter(MpegEncContext *s)
|
||||||
{
|
{
|
||||||
H261Context *h = (H261Context *)s;
|
H261Context *const h = s->private_ctx;
|
||||||
const int linesize = s->linesize;
|
const int linesize = s->linesize;
|
||||||
const int uvlinesize = s->uvlinesize;
|
const int uvlinesize = s->uvlinesize;
|
||||||
uint8_t *dest_y = s->dest[0];
|
uint8_t *dest_y = s->dest[0];
|
||||||
|
@ -35,15 +35,7 @@
|
|||||||
* H261Context
|
* H261Context
|
||||||
*/
|
*/
|
||||||
typedef struct H261Context {
|
typedef struct H261Context {
|
||||||
MpegEncContext s;
|
|
||||||
|
|
||||||
int current_mba;
|
|
||||||
int mba_diff;
|
|
||||||
int mtype;
|
int mtype;
|
||||||
int current_mv_x;
|
|
||||||
int current_mv_y;
|
|
||||||
int gob_number;
|
|
||||||
int gob_start_code_skipped; // 1 if gob start code is already read before gob header is read
|
|
||||||
} H261Context;
|
} H261Context;
|
||||||
|
|
||||||
#define MB_TYPE_H261_FIL 0x800000
|
#define MB_TYPE_H261_FIL 0x800000
|
||||||
|
@ -47,6 +47,19 @@ static VLC h261_mtype_vlc;
|
|||||||
static VLC h261_mv_vlc;
|
static VLC h261_mv_vlc;
|
||||||
static VLC h261_cbp_vlc;
|
static VLC h261_cbp_vlc;
|
||||||
|
|
||||||
|
typedef struct H261DecContext {
|
||||||
|
MpegEncContext s;
|
||||||
|
|
||||||
|
H261Context common;
|
||||||
|
|
||||||
|
int current_mba;
|
||||||
|
int mba_diff;
|
||||||
|
int current_mv_x;
|
||||||
|
int current_mv_y;
|
||||||
|
int gob_number;
|
||||||
|
int gob_start_code_skipped; // 1 if gob start code is already read before gob header is read
|
||||||
|
} H261DecContext;
|
||||||
|
|
||||||
static av_cold void h261_decode_init_static(void)
|
static av_cold void h261_decode_init_static(void)
|
||||||
{
|
{
|
||||||
INIT_VLC_STATIC(&h261_mba_vlc, H261_MBA_VLC_BITS, 35,
|
INIT_VLC_STATIC(&h261_mba_vlc, H261_MBA_VLC_BITS, 35,
|
||||||
@ -67,9 +80,10 @@ static av_cold void h261_decode_init_static(void)
|
|||||||
static av_cold int h261_decode_init(AVCodecContext *avctx)
|
static av_cold int h261_decode_init(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
static AVOnce init_static_once = AV_ONCE_INIT;
|
static AVOnce init_static_once = AV_ONCE_INIT;
|
||||||
H261Context *h = avctx->priv_data;
|
H261DecContext *const h = avctx->priv_data;
|
||||||
MpegEncContext *const s = &h->s;
|
MpegEncContext *const s = &h->s;
|
||||||
|
|
||||||
|
s->private_ctx = &h->common;
|
||||||
// set defaults
|
// set defaults
|
||||||
ff_mpv_decode_init(s, avctx);
|
ff_mpv_decode_init(s, avctx);
|
||||||
|
|
||||||
@ -89,7 +103,7 @@ static av_cold int h261_decode_init(AVCodecContext *avctx)
|
|||||||
* Decode the group of blocks header or slice header.
|
* Decode the group of blocks header or slice header.
|
||||||
* @return <0 if an error occurred
|
* @return <0 if an error occurred
|
||||||
*/
|
*/
|
||||||
static int h261_decode_gob_header(H261Context *h)
|
static int h261_decode_gob_header(H261DecContext *h)
|
||||||
{
|
{
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
MpegEncContext *const s = &h->s;
|
MpegEncContext *const s = &h->s;
|
||||||
@ -143,7 +157,7 @@ static int h261_decode_gob_header(H261Context *h)
|
|||||||
* Decode the group of blocks / video packet header.
|
* Decode the group of blocks / video packet header.
|
||||||
* @return <0 if no resync found
|
* @return <0 if no resync found
|
||||||
*/
|
*/
|
||||||
static int h261_resync(H261Context *h)
|
static int h261_resync(H261DecContext *h)
|
||||||
{
|
{
|
||||||
MpegEncContext *const s = &h->s;
|
MpegEncContext *const s = &h->s;
|
||||||
int left, ret;
|
int left, ret;
|
||||||
@ -184,7 +198,7 @@ static int h261_resync(H261Context *h)
|
|||||||
* Decode skipped macroblocks.
|
* Decode skipped macroblocks.
|
||||||
* @return 0
|
* @return 0
|
||||||
*/
|
*/
|
||||||
static int h261_decode_mb_skipped(H261Context *h, int mba1, int mba2)
|
static int h261_decode_mb_skipped(H261DecContext *h, int mba1, int mba2)
|
||||||
{
|
{
|
||||||
MpegEncContext *const s = &h->s;
|
MpegEncContext *const s = &h->s;
|
||||||
int i;
|
int i;
|
||||||
@ -209,7 +223,7 @@ static int h261_decode_mb_skipped(H261Context *h, int mba1, int mba2)
|
|||||||
s->mv[0][0][0] = 0;
|
s->mv[0][0][0] = 0;
|
||||||
s->mv[0][0][1] = 0;
|
s->mv[0][0][1] = 0;
|
||||||
s->mb_skipped = 1;
|
s->mb_skipped = 1;
|
||||||
h->mtype &= ~MB_TYPE_H261_FIL;
|
h->common.mtype &= ~MB_TYPE_H261_FIL;
|
||||||
|
|
||||||
if (s->current_picture.motion_val[0]) {
|
if (s->current_picture.motion_val[0]) {
|
||||||
int b_stride = 2*s->mb_width + 1;
|
int b_stride = 2*s->mb_width + 1;
|
||||||
@ -254,7 +268,7 @@ static int decode_mv_component(GetBitContext *gb, int v)
|
|||||||
* Decode a macroblock.
|
* Decode a macroblock.
|
||||||
* @return <0 if an error occurred
|
* @return <0 if an error occurred
|
||||||
*/
|
*/
|
||||||
static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded)
|
static int h261_decode_block(H261DecContext *h, int16_t *block, int n, int coded)
|
||||||
{
|
{
|
||||||
MpegEncContext *const s = &h->s;
|
MpegEncContext *const s = &h->s;
|
||||||
int level, i, j, run;
|
int level, i, j, run;
|
||||||
@ -346,9 +360,10 @@ static int h261_decode_block(H261Context *h, int16_t *block, int n, int coded)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h261_decode_mb(H261Context *h)
|
static int h261_decode_mb(H261DecContext *h)
|
||||||
{
|
{
|
||||||
MpegEncContext *const s = &h->s;
|
MpegEncContext *const s = &h->s;
|
||||||
|
H261Context *const com = &h->common;
|
||||||
int i, cbp, xy;
|
int i, cbp, xy;
|
||||||
|
|
||||||
cbp = 63;
|
cbp = 63;
|
||||||
@ -386,23 +401,23 @@ static int h261_decode_mb(H261Context *h)
|
|||||||
ff_update_block_index(s);
|
ff_update_block_index(s);
|
||||||
|
|
||||||
// Read mtype
|
// Read mtype
|
||||||
h->mtype = get_vlc2(&s->gb, h261_mtype_vlc.table, H261_MTYPE_VLC_BITS, 2);
|
com->mtype = get_vlc2(&s->gb, h261_mtype_vlc.table, H261_MTYPE_VLC_BITS, 2);
|
||||||
if (h->mtype < 0) {
|
if (com->mtype < 0) {
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "Invalid mtype index %d\n",
|
av_log(s->avctx, AV_LOG_ERROR, "Invalid mtype index %d\n",
|
||||||
h->mtype);
|
com->mtype);
|
||||||
return SLICE_ERROR;
|
return SLICE_ERROR;
|
||||||
}
|
}
|
||||||
av_assert0(h->mtype < FF_ARRAY_ELEMS(ff_h261_mtype_map));
|
av_assert0(com->mtype < FF_ARRAY_ELEMS(ff_h261_mtype_map));
|
||||||
h->mtype = ff_h261_mtype_map[h->mtype];
|
com->mtype = ff_h261_mtype_map[com->mtype];
|
||||||
|
|
||||||
// Read mquant
|
// Read mquant
|
||||||
if (IS_QUANT(h->mtype))
|
if (IS_QUANT(com->mtype))
|
||||||
ff_set_qscale(s, get_bits(&s->gb, 5));
|
ff_set_qscale(s, get_bits(&s->gb, 5));
|
||||||
|
|
||||||
s->mb_intra = IS_INTRA4x4(h->mtype);
|
s->mb_intra = IS_INTRA4x4(com->mtype);
|
||||||
|
|
||||||
// Read mv
|
// Read mv
|
||||||
if (IS_16X16(h->mtype)) {
|
if (IS_16X16(com->mtype)) {
|
||||||
/* Motion vector data is included for all MC macroblocks. MVD is
|
/* Motion vector data is included for all MC macroblocks. MVD is
|
||||||
* obtained from the macroblock vector by subtracting the vector
|
* obtained from the macroblock vector by subtracting the vector
|
||||||
* of the preceding macroblock. For this calculation the vector
|
* of the preceding macroblock. For this calculation the vector
|
||||||
@ -425,7 +440,7 @@ static int h261_decode_mb(H261Context *h)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read cbp
|
// Read cbp
|
||||||
if (HAS_CBP(h->mtype))
|
if (HAS_CBP(com->mtype))
|
||||||
cbp = get_vlc2(&s->gb, h261_cbp_vlc.table, H261_CBP_VLC_BITS, 1) + 1;
|
cbp = get_vlc2(&s->gb, h261_cbp_vlc.table, H261_CBP_VLC_BITS, 1) + 1;
|
||||||
|
|
||||||
if (s->mb_intra) {
|
if (s->mb_intra) {
|
||||||
@ -449,7 +464,7 @@ static int h261_decode_mb(H261Context *h)
|
|||||||
|
|
||||||
intra:
|
intra:
|
||||||
/* decode each block */
|
/* decode each block */
|
||||||
if (s->mb_intra || HAS_CBP(h->mtype)) {
|
if (s->mb_intra || HAS_CBP(com->mtype)) {
|
||||||
s->bdsp.clear_blocks(s->block[0]);
|
s->bdsp.clear_blocks(s->block[0]);
|
||||||
for (i = 0; i < 6; i++) {
|
for (i = 0; i < 6; i++) {
|
||||||
if (h261_decode_block(h, s->block[i], i, cbp & 32) < 0)
|
if (h261_decode_block(h, s->block[i], i, cbp & 32) < 0)
|
||||||
@ -470,7 +485,7 @@ intra:
|
|||||||
* Decode the H.261 picture header.
|
* Decode the H.261 picture header.
|
||||||
* @return <0 if no startcode found
|
* @return <0 if no startcode found
|
||||||
*/
|
*/
|
||||||
static int h261_decode_picture_header(H261Context *h)
|
static int h261_decode_picture_header(H261DecContext *h)
|
||||||
{
|
{
|
||||||
MpegEncContext *const s = &h->s;
|
MpegEncContext *const s = &h->s;
|
||||||
int format, i;
|
int format, i;
|
||||||
@ -534,7 +549,7 @@ static int h261_decode_picture_header(H261Context *h)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int h261_decode_gob(H261Context *h)
|
static int h261_decode_gob(H261DecContext *h)
|
||||||
{
|
{
|
||||||
MpegEncContext *const s = &h->s;
|
MpegEncContext *const s = &h->s;
|
||||||
|
|
||||||
@ -580,9 +595,9 @@ static int get_consumed_bytes(MpegEncContext *s, int buf_size)
|
|||||||
static int h261_decode_frame(AVCodecContext *avctx, void *data,
|
static int h261_decode_frame(AVCodecContext *avctx, void *data,
|
||||||
int *got_frame, AVPacket *avpkt)
|
int *got_frame, AVPacket *avpkt)
|
||||||
{
|
{
|
||||||
|
H261DecContext *const h = avctx->priv_data;
|
||||||
const uint8_t *buf = avpkt->data;
|
const uint8_t *buf = avpkt->data;
|
||||||
int buf_size = avpkt->size;
|
int buf_size = avpkt->size;
|
||||||
H261Context *h = avctx->priv_data;
|
|
||||||
MpegEncContext *s = &h->s;
|
MpegEncContext *s = &h->s;
|
||||||
int ret;
|
int ret;
|
||||||
AVFrame *pict = data;
|
AVFrame *pict = data;
|
||||||
@ -657,7 +672,7 @@ retry:
|
|||||||
|
|
||||||
static av_cold int h261_decode_end(AVCodecContext *avctx)
|
static av_cold int h261_decode_end(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
H261Context *h = avctx->priv_data;
|
H261DecContext *const h = avctx->priv_data;
|
||||||
MpegEncContext *s = &h->s;
|
MpegEncContext *s = &h->s;
|
||||||
|
|
||||||
ff_mpv_common_end(s);
|
ff_mpv_common_end(s);
|
||||||
@ -669,7 +684,7 @@ const AVCodec ff_h261_decoder = {
|
|||||||
.long_name = NULL_IF_CONFIG_SMALL("H.261"),
|
.long_name = NULL_IF_CONFIG_SMALL("H.261"),
|
||||||
.type = AVMEDIA_TYPE_VIDEO,
|
.type = AVMEDIA_TYPE_VIDEO,
|
||||||
.id = AV_CODEC_ID_H261,
|
.id = AV_CODEC_ID_H261,
|
||||||
.priv_data_size = sizeof(H261Context),
|
.priv_data_size = sizeof(H261DecContext),
|
||||||
.init = h261_decode_init,
|
.init = h261_decode_init,
|
||||||
.close = h261_decode_end,
|
.close = h261_decode_end,
|
||||||
.decode = h261_decode_frame,
|
.decode = h261_decode_frame,
|
||||||
|
@ -37,6 +37,14 @@
|
|||||||
static uint8_t uni_h261_rl_len [64*64*2*2];
|
static uint8_t uni_h261_rl_len [64*64*2*2];
|
||||||
#define UNI_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
|
#define UNI_ENC_INDEX(last,run,level) ((last)*128*64 + (run)*128 + (level))
|
||||||
|
|
||||||
|
typedef struct H261EncContext {
|
||||||
|
MpegEncContext s;
|
||||||
|
|
||||||
|
H261Context common;
|
||||||
|
|
||||||
|
int gob_number;
|
||||||
|
} H261EncContext;
|
||||||
|
|
||||||
int ff_h261_get_picture_format(int width, int height)
|
int ff_h261_get_picture_format(int width, int height)
|
||||||
{
|
{
|
||||||
// QCIF
|
// QCIF
|
||||||
@ -52,7 +60,7 @@ int ff_h261_get_picture_format(int width, int height)
|
|||||||
|
|
||||||
void ff_h261_encode_picture_header(MpegEncContext *s, int picture_number)
|
void ff_h261_encode_picture_header(MpegEncContext *s, int picture_number)
|
||||||
{
|
{
|
||||||
H261Context *h = (H261Context *)s;
|
H261EncContext *const h = (H261EncContext *)s;
|
||||||
int format, temp_ref;
|
int format, temp_ref;
|
||||||
|
|
||||||
align_put_bits(&s->pb);
|
align_put_bits(&s->pb);
|
||||||
@ -90,7 +98,7 @@ void ff_h261_encode_picture_header(MpegEncContext *s, int picture_number)
|
|||||||
*/
|
*/
|
||||||
static void h261_encode_gob_header(MpegEncContext *s, int mb_line)
|
static void h261_encode_gob_header(MpegEncContext *s, int mb_line)
|
||||||
{
|
{
|
||||||
H261Context *h = (H261Context *)s;
|
H261EncContext *const h = (H261EncContext *)s;
|
||||||
if (ff_h261_get_picture_format(s->width, s->height) == 0) {
|
if (ff_h261_get_picture_format(s->width, s->height) == 0) {
|
||||||
h->gob_number += 2; // QCIF
|
h->gob_number += 2; // QCIF
|
||||||
} else {
|
} else {
|
||||||
@ -132,7 +140,7 @@ void ff_h261_reorder_mb_index(MpegEncContext *s)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void h261_encode_motion(H261Context *h, int val)
|
static void h261_encode_motion(H261EncContext *h, int val)
|
||||||
{
|
{
|
||||||
MpegEncContext *const s = &h->s;
|
MpegEncContext *const s = &h->s;
|
||||||
int sign, code;
|
int sign, code;
|
||||||
@ -166,7 +174,7 @@ static inline int get_cbp(MpegEncContext *s, int16_t block[6][64])
|
|||||||
* @param block the 8x8 block
|
* @param block the 8x8 block
|
||||||
* @param n block index (0-3 are luma, 4-5 are chroma)
|
* @param n block index (0-3 are luma, 4-5 are chroma)
|
||||||
*/
|
*/
|
||||||
static void h261_encode_block(H261Context *h, int16_t *block, int n)
|
static void h261_encode_block(H261EncContext *h, int16_t *block, int n)
|
||||||
{
|
{
|
||||||
MpegEncContext *const s = &h->s;
|
MpegEncContext *const s = &h->s;
|
||||||
int level, run, i, j, last_index, last_non_zero, sign, slevel, code;
|
int level, run, i, j, last_index, last_non_zero, sign, slevel, code;
|
||||||
@ -237,12 +245,15 @@ static void h261_encode_block(H261Context *h, int16_t *block, int n)
|
|||||||
void ff_h261_encode_mb(MpegEncContext *s, int16_t block[6][64],
|
void ff_h261_encode_mb(MpegEncContext *s, int16_t block[6][64],
|
||||||
int motion_x, int motion_y)
|
int motion_x, int motion_y)
|
||||||
{
|
{
|
||||||
H261Context *h = (H261Context *)s;
|
/* The following is only allowed because this encoder
|
||||||
|
* does not use slice threading. */
|
||||||
|
H261EncContext *const h = (H261EncContext *)s;
|
||||||
|
H261Context *const com = &h->common;
|
||||||
int mvd, mv_diff_x, mv_diff_y, i, cbp;
|
int mvd, mv_diff_x, mv_diff_y, i, cbp;
|
||||||
cbp = 63; // avoid warning
|
cbp = 63; // avoid warning
|
||||||
mvd = 0;
|
mvd = 0;
|
||||||
|
|
||||||
h->mtype = 0;
|
com->mtype = 0;
|
||||||
|
|
||||||
if (!s->mb_intra) {
|
if (!s->mb_intra) {
|
||||||
/* compute cbp */
|
/* compute cbp */
|
||||||
@ -270,34 +281,34 @@ void ff_h261_encode_mb(MpegEncContext *s, int16_t block[6][64],
|
|||||||
|
|
||||||
/* calculate MTYPE */
|
/* calculate MTYPE */
|
||||||
if (!s->mb_intra) {
|
if (!s->mb_intra) {
|
||||||
h->mtype++;
|
com->mtype++;
|
||||||
|
|
||||||
if (mvd || s->loop_filter)
|
if (mvd || s->loop_filter)
|
||||||
h->mtype += 3;
|
com->mtype += 3;
|
||||||
if (s->loop_filter)
|
if (s->loop_filter)
|
||||||
h->mtype += 3;
|
com->mtype += 3;
|
||||||
if (cbp)
|
if (cbp)
|
||||||
h->mtype++;
|
com->mtype++;
|
||||||
av_assert1(h->mtype > 1);
|
av_assert1(com->mtype > 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->dquant && cbp) {
|
if (s->dquant && cbp) {
|
||||||
h->mtype++;
|
com->mtype++;
|
||||||
} else
|
} else
|
||||||
s->qscale -= s->dquant;
|
s->qscale -= s->dquant;
|
||||||
|
|
||||||
put_bits(&s->pb,
|
put_bits(&s->pb,
|
||||||
ff_h261_mtype_bits[h->mtype],
|
ff_h261_mtype_bits[com->mtype],
|
||||||
ff_h261_mtype_code[h->mtype]);
|
ff_h261_mtype_code[com->mtype]);
|
||||||
|
|
||||||
h->mtype = ff_h261_mtype_map[h->mtype];
|
com->mtype = ff_h261_mtype_map[com->mtype];
|
||||||
|
|
||||||
if (IS_QUANT(h->mtype)) {
|
if (IS_QUANT(com->mtype)) {
|
||||||
ff_set_qscale(s, s->qscale + s->dquant);
|
ff_set_qscale(s, s->qscale + s->dquant);
|
||||||
put_bits(&s->pb, 5, s->qscale);
|
put_bits(&s->pb, 5, s->qscale);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_16X16(h->mtype)) {
|
if (IS_16X16(com->mtype)) {
|
||||||
mv_diff_x = (motion_x >> 1) - s->last_mv[0][0][0];
|
mv_diff_x = (motion_x >> 1) - s->last_mv[0][0][0];
|
||||||
mv_diff_y = (motion_y >> 1) - s->last_mv[0][0][1];
|
mv_diff_y = (motion_y >> 1) - s->last_mv[0][0][1];
|
||||||
s->last_mv[0][0][0] = (motion_x >> 1);
|
s->last_mv[0][0][0] = (motion_x >> 1);
|
||||||
@ -306,7 +317,7 @@ void ff_h261_encode_mb(MpegEncContext *s, int16_t block[6][64],
|
|||||||
h261_encode_motion(h, mv_diff_y);
|
h261_encode_motion(h, mv_diff_y);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HAS_CBP(h->mtype)) {
|
if (HAS_CBP(com->mtype)) {
|
||||||
av_assert1(cbp > 0);
|
av_assert1(cbp > 0);
|
||||||
put_bits(&s->pb,
|
put_bits(&s->pb,
|
||||||
ff_h261_cbp_tab[cbp - 1][1],
|
ff_h261_cbp_tab[cbp - 1][1],
|
||||||
@ -316,7 +327,7 @@ void ff_h261_encode_mb(MpegEncContext *s, int16_t block[6][64],
|
|||||||
/* encode each block */
|
/* encode each block */
|
||||||
h261_encode_block(h, block[i], i);
|
h261_encode_block(h, block[i], i);
|
||||||
|
|
||||||
if (!IS_16X16(h->mtype)) {
|
if (!IS_16X16(com->mtype)) {
|
||||||
s->last_mv[0][0][0] = 0;
|
s->last_mv[0][0][0] = 0;
|
||||||
s->last_mv[0][0][1] = 0;
|
s->last_mv[0][0][1] = 0;
|
||||||
}
|
}
|
||||||
@ -371,8 +382,11 @@ static av_cold void h261_encode_init_static(void)
|
|||||||
|
|
||||||
av_cold void ff_h261_encode_init(MpegEncContext *s)
|
av_cold void ff_h261_encode_init(MpegEncContext *s)
|
||||||
{
|
{
|
||||||
|
H261EncContext *const h = (H261EncContext*)s;
|
||||||
static AVOnce init_static_once = AV_ONCE_INIT;
|
static AVOnce init_static_once = AV_ONCE_INIT;
|
||||||
|
|
||||||
|
s->private_ctx = &h->common;
|
||||||
|
|
||||||
s->min_qcoeff = -127;
|
s->min_qcoeff = -127;
|
||||||
s->max_qcoeff = 127;
|
s->max_qcoeff = 127;
|
||||||
s->y_dc_scale_table =
|
s->y_dc_scale_table =
|
||||||
@ -390,7 +404,7 @@ const AVCodec ff_h261_encoder = {
|
|||||||
.type = AVMEDIA_TYPE_VIDEO,
|
.type = AVMEDIA_TYPE_VIDEO,
|
||||||
.id = AV_CODEC_ID_H261,
|
.id = AV_CODEC_ID_H261,
|
||||||
.priv_class = &ff_mpv_enc_class,
|
.priv_class = &ff_mpv_enc_class,
|
||||||
.priv_data_size = sizeof(H261Context),
|
.priv_data_size = sizeof(H261EncContext),
|
||||||
.init = ff_mpv_encode_init,
|
.init = ff_mpv_encode_init,
|
||||||
.encode2 = ff_mpv_encode_picture,
|
.encode2 = ff_mpv_encode_picture,
|
||||||
.close = ff_mpv_encode_end,
|
.close = ff_mpv_encode_end,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user