[FFmpeg-cvslog] avcodec/mpegvideo_enc: Use function ptr for encode_picture_header
Andreas Rheinhardt
git at videolan.org
Wed Mar 26 06:09:32 EET 2025
ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Mon Mar 3 23:35:01 2025 +0100| [ecba58311cf21d842b1ecabd449a4dece4b78a7b] | committer: Andreas Rheinhardt
avcodec/mpegvideo_enc: Use function ptr for encode_picture_header
This gets rid of a switch and (in case of FMT_H263) several
ifs.
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ecba58311cf21d842b1ecabd449a4dece4b78a7b
---
libavcodec/flvenc.c | 5 +++-
libavcodec/flvenc.h | 5 ++--
libavcodec/h261enc.c | 8 +++++--
libavcodec/h261enc.h | 1 -
libavcodec/h263enc.h | 3 +--
libavcodec/ituh263enc.c | 13 +++++++++--
libavcodec/mjpegenc.c | 12 ++++++----
libavcodec/mjpegenc.h | 1 -
libavcodec/mpeg12enc.c | 6 ++++-
libavcodec/mpeg12enc.h | 3 +--
libavcodec/mpeg4videoenc.c | 7 ++++--
libavcodec/mpeg4videoenc.h | 4 ++--
libavcodec/mpegvideo_enc.c | 58 +++++++++-------------------------------------
libavcodec/mpegvideoenc.h | 2 ++
libavcodec/msmpeg4enc.c | 40 +++++++++++++++++++-------------
libavcodec/msmpeg4enc.h | 3 +--
libavcodec/rv10enc.c | 3 ++-
libavcodec/rv10enc.h | 6 ++---
libavcodec/rv20enc.c | 6 ++++-
libavcodec/speedhqenc.c | 12 +++++++---
libavcodec/speedhqenc.h | 1 -
libavcodec/wmv2enc.c | 6 +++--
libavcodec/wmv2enc.h | 1 -
23 files changed, 107 insertions(+), 99 deletions(-)
diff --git a/libavcodec/flvenc.c b/libavcodec/flvenc.c
index 0cd20f026d..b4a30fe558 100644
--- a/libavcodec/flvenc.c
+++ b/libavcodec/flvenc.c
@@ -23,8 +23,9 @@
#include "mpegvideo.h"
#include "mpegvideoenc.h"
-void ff_flv_encode_picture_header(MpegEncContext *s)
+int ff_flv_encode_picture_header(MPVMainEncContext *const m)
{
+ MpegEncContext *const s = &m->s;
int format;
align_put_bits(&s->pb);
@@ -61,6 +62,8 @@ void ff_flv_encode_picture_header(MpegEncContext *s)
put_bits(&s->pb, 1, 1); /* DeblockingFlag: on */
put_bits(&s->pb, 5, s->qscale); /* Quantizer */
put_bits(&s->pb, 1, 0); /* ExtraInformation */
+
+ return 0;
}
void ff_flv2_encode_ac_esc(PutBitContext *pb, int slevel, int level,
diff --git a/libavcodec/flvenc.h b/libavcodec/flvenc.h
index 1ecbb46b17..3dc7480376 100644
--- a/libavcodec/flvenc.h
+++ b/libavcodec/flvenc.h
@@ -21,10 +21,11 @@
#ifndef AVCODEC_FLVENC_H
#define AVCODEC_FLVENC_H
-#include "mpegvideo.h"
#include "put_bits.h"
-void ff_flv_encode_picture_header(MpegEncContext *s);
+typedef struct MPVMainEncContext MPVMainEncContext;
+
+int ff_flv_encode_picture_header(MPVMainEncContext *const m);
void ff_flv2_encode_ac_esc(PutBitContext *pb, int slevel, int level, int run,
int last);
diff --git a/libavcodec/h261enc.c b/libavcodec/h261enc.c
index e3bacb9c09..0e89b0e942 100644
--- a/libavcodec/h261enc.c
+++ b/libavcodec/h261enc.c
@@ -66,9 +66,10 @@ typedef struct H261EncContext {
} format;
} H261EncContext;
-void ff_h261_encode_picture_header(MpegEncContext *s)
+static int h261_encode_picture_header(MPVMainEncContext *const m)
{
- H261EncContext *const h = (H261EncContext *)s;
+ H261EncContext *const h = (H261EncContext *)m;
+ MpegEncContext *const s = &h->s.s;
int temp_ref;
align_put_bits(&s->pb);
@@ -94,6 +95,8 @@ void ff_h261_encode_picture_header(MpegEncContext *s)
put_bits(&s->pb, 1, 0); /* no PEI */
h->gob_number = h->format - 1;
s->mb_skip_run = 0;
+
+ return 0;
}
/**
@@ -370,6 +373,7 @@ static av_cold int h261_encode_init(AVCodecContext *avctx)
return AVERROR(EINVAL);
}
s->private_ctx = &h->common;
+ h->s.encode_picture_header = h261_encode_picture_header;
s->min_qcoeff = -127;
s->max_qcoeff = 127;
diff --git a/libavcodec/h261enc.h b/libavcodec/h261enc.h
index 7877d8aa9d..092363b6f3 100644
--- a/libavcodec/h261enc.h
+++ b/libavcodec/h261enc.h
@@ -33,6 +33,5 @@
void ff_h261_reorder_mb_index(MpegEncContext *s);
void ff_h261_encode_mb(MpegEncContext *s, int16_t block[6][64],
int motion_x, int motion_y);
-void ff_h261_encode_picture_header(MpegEncContext *s);
#endif
diff --git a/libavcodec/h263enc.h b/libavcodec/h263enc.h
index 71e30931aa..29a785dfeb 100644
--- a/libavcodec/h263enc.h
+++ b/libavcodec/h263enc.h
@@ -26,8 +26,7 @@
const uint8_t (*ff_h263_get_mv_penalty(void))[MAX_DMV*2+1];
-void ff_h263_encode_init(MpegEncContext *s);
-void ff_h263_encode_picture_header(MpegEncContext *s);
+void ff_h263_encode_init(MPVMainEncContext *m);
void ff_h263_encode_gob_header(MpegEncContext * s, int mb_line);
void ff_h263_encode_mb(MpegEncContext *s,
int16_t block[6][64],
diff --git a/libavcodec/ituh263enc.c b/libavcodec/ituh263enc.c
index 825b398455..c82e0ceffd 100644
--- a/libavcodec/ituh263enc.c
+++ b/libavcodec/ituh263enc.c
@@ -221,8 +221,9 @@ av_const int ff_h263_aspect_to_info(AVRational aspect){
return FF_ASPECT_EXTENDED;
}
-void ff_h263_encode_picture_header(MpegEncContext * s)
+static int h263_encode_picture_header(MPVMainEncContext *const m)
{
+ MpegEncContext *const s = &m->s;
int format, coded_frame_rate, coded_frame_rate_base, i, temp_ref;
int best_clock_code=1;
int best_divisor=60;
@@ -354,6 +355,8 @@ void ff_h263_encode_picture_header(MpegEncContext * s)
put_bits(&s->pb, 1, 1);
}
+
+ return 0;
}
/**
@@ -819,8 +822,10 @@ void ff_h263_update_mb(MpegEncContext *s)
ff_h263_update_motion_val(s);
}
-av_cold void ff_h263_encode_init(MpegEncContext *s)
+av_cold void ff_h263_encode_init(MPVMainEncContext *const m)
{
+ MpegEncContext *const s = &m->s;
+
s->me.mv_penalty = ff_h263_get_mv_penalty(); // FIXME exact table for MSMPEG4 & H.263+
s->intra_ac_vlc_length =s->inter_ac_vlc_length = uni_h263_inter_rl_len;
@@ -854,6 +859,7 @@ av_cold void ff_h263_encode_init(MpegEncContext *s)
break;
// Note for MPEG-4 & H.263 the dc-scale table will be set per frame as needed later
case AV_CODEC_ID_FLV1:
+ m->encode_picture_header = ff_flv_encode_picture_header;
if (s->h263_flv > 1) {
s->min_qcoeff= -1023;
s->max_qcoeff= 1023;
@@ -866,6 +872,9 @@ av_cold void ff_h263_encode_init(MpegEncContext *s)
s->min_qcoeff= -127;
s->max_qcoeff= 127;
}
+ // H.263, H.263+; will be overwritten for MSMPEG-4 later
+ if (!m->encode_picture_header)
+ m->encode_picture_header = h263_encode_picture_header;
ff_h263dsp_init(&s->h263dsp);
}
diff --git a/libavcodec/mjpegenc.c b/libavcodec/mjpegenc.c
index a77a703f53..7706f52148 100644
--- a/libavcodec/mjpegenc.c
+++ b/libavcodec/mjpegenc.c
@@ -104,13 +104,16 @@ static void mjpeg_encode_picture_header(MpegEncContext *s)
s->thread_context[i]->esc_pos = 0;
}
-void ff_mjpeg_amv_encode_picture_header(MpegEncContext *s)
+static int mjpeg_amv_encode_picture_header(MPVMainEncContext *const m)
{
- MJPEGEncContext *const m = (MJPEGEncContext*)s;
- av_assert2(s->mjpeg_ctx == &m->mjpeg);
+ MJPEGEncContext *const m2 = (MJPEGEncContext*)m;
+ MpegEncContext *const s = &m->s;
+ av_assert2(s->mjpeg_ctx == &m2->mjpeg);
/* s->huffman == HUFFMAN_TABLE_OPTIMAL can only be true for MJPEG. */
- if (!CONFIG_MJPEG_ENCODER || m->mjpeg.huffman != HUFFMAN_TABLE_OPTIMAL)
+ if (!CONFIG_MJPEG_ENCODER || m2->mjpeg.huffman != HUFFMAN_TABLE_OPTIMAL)
mjpeg_encode_picture_header(s);
+
+ return 0;
}
#if CONFIG_MJPEG_ENCODER
@@ -309,6 +312,7 @@ static av_cold int mjpeg_encode_init(AVCodecContext *avctx)
int ret;
s->mjpeg_ctx = m;
+ m2->mpeg.encode_picture_header = mjpeg_amv_encode_picture_header;
if (s->mpv_flags & FF_MPV_FLAG_QP_RD) {
// Used to produce garbage with MJPEG.
diff --git a/libavcodec/mjpegenc.h b/libavcodec/mjpegenc.h
index 2c98de057a..9610656aaa 100644
--- a/libavcodec/mjpegenc.h
+++ b/libavcodec/mjpegenc.h
@@ -94,7 +94,6 @@ static inline void put_marker(PutBitContext *p, enum JpegMarker code)
typedef struct MpegEncContext MpegEncContext;
-void ff_mjpeg_amv_encode_picture_header(MpegEncContext *s);
void ff_mjpeg_encode_mb(MpegEncContext *s, int16_t block[12][64]);
int ff_mjpeg_encode_stuffing(MpegEncContext *s);
diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c
index ed2c63086f..f28a41f5ff 100644
--- a/libavcodec/mpeg12enc.c
+++ b/libavcodec/mpeg12enc.c
@@ -333,7 +333,7 @@ void ff_mpeg1_encode_slice_header(MpegEncContext *s)
put_bits(&s->pb, 1, 0);
}
-void ff_mpeg1_encode_picture_header(MPVMainEncContext *const m)
+static int mpeg1_encode_picture_header(MPVMainEncContext *const m)
{
MPEG12EncContext *const mpeg12 = (MPEG12EncContext*)m;
MpegEncContext *const s = &m->s;
@@ -485,6 +485,8 @@ void ff_mpeg1_encode_picture_header(MPVMainEncContext *const m)
s->mb_y = 0;
ff_mpeg1_encode_slice_header(s);
+
+ return 0;
}
static inline void put_mb_modes(MpegEncContext *s, int n, int bits,
@@ -1108,6 +1110,8 @@ static av_cold int encode_init(AVCodecContext *avctx)
}
}
+ m->encode_picture_header = mpeg1_encode_picture_header;
+
s->me.mv_penalty = mv_penalty;
s->fcode_tab = fcode_tab + MAX_MV;
if (avctx->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
diff --git a/libavcodec/mpeg12enc.h b/libavcodec/mpeg12enc.h
index fa1504177a..6c3709bbff 100644
--- a/libavcodec/mpeg12enc.h
+++ b/libavcodec/mpeg12enc.h
@@ -24,10 +24,9 @@
#include <stdint.h>
-#include "mpegvideoenc.h"
+#include "mpegvideo.h"
#include "mpegvideodata.h"
-void ff_mpeg1_encode_picture_header(MPVMainEncContext *m);
void ff_mpeg1_encode_mb(MpegEncContext *s, int16_t block[8][64],
int motion_x, int motion_y);
void ff_mpeg1_encode_slice_header(MpegEncContext *s);
diff --git a/libavcodec/mpeg4videoenc.c b/libavcodec/mpeg4videoenc.c
index c265316ed6..f34ea1fcb4 100644
--- a/libavcodec/mpeg4videoenc.c
+++ b/libavcodec/mpeg4videoenc.c
@@ -1062,7 +1062,7 @@ static void mpeg4_encode_vol_header(Mpeg4EncContext *const m4,
}
/* write MPEG-4 VOP header */
-int ff_mpeg4_encode_picture_header(MPVMainEncContext *const m)
+static int mpeg4_encode_picture_header(MPVMainEncContext *const m)
{
Mpeg4EncContext *const m4 = mainctx_to_mpeg4(m);
MpegEncContext *const s = &m->s;
@@ -1291,7 +1291,8 @@ static av_cold int encode_init(AVCodecContext *avctx)
{
static AVOnce init_static_once = AV_ONCE_INIT;
Mpeg4EncContext *const m4 = avctx->priv_data;
- MpegEncContext *const s = &m4->m.s;
+ MPVMainEncContext *const m = &m4->m;
+ MpegEncContext *const s = &m->s;
int ret;
if (avctx->width >= (1<<13) || avctx->height >= (1<<13)) {
@@ -1299,6 +1300,8 @@ static av_cold int encode_init(AVCodecContext *avctx)
return AVERROR(EINVAL);
}
+ m->encode_picture_header = mpeg4_encode_picture_header;
+
ff_qpeldsp_init(&s->qdsp);
if ((ret = ff_mpv_encode_init(avctx)) < 0)
return ret;
diff --git a/libavcodec/mpeg4videoenc.h b/libavcodec/mpeg4videoenc.h
index 1c53ce4ede..4565a518b2 100644
--- a/libavcodec/mpeg4videoenc.h
+++ b/libavcodec/mpeg4videoenc.h
@@ -25,14 +25,14 @@
#include <stdint.h>
-#include "mpegvideoenc.h"
#include "put_bits.h"
+typedef struct MpegEncContext MpegEncContext;
+
void ff_mpeg4_encode_mb(MpegEncContext *s,
int16_t block[6][64],
int motion_x, int motion_y);
void ff_set_mpeg4_time(MpegEncContext *s);
-int ff_mpeg4_encode_picture_header(MPVMainEncContext *m);
void ff_mpeg4_encode_video_packet_header(MpegEncContext *s);
void ff_mpeg4_stuffing(PutBitContext *pbc);
diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index d4f4f825ff..03a8ae2687 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -66,7 +66,6 @@
#include "qpeldsp.h"
#include "faandct.h"
#include "aandcttab.h"
-#include "flvenc.h"
#include "mpeg4video.h"
#include "mpeg4videodata.h"
#include "mpeg4videoenc.h"
@@ -809,12 +808,17 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
avctx->delay = 0;
s->low_delay = 1;
break;
+#if CONFIG_RV10_ENCODER
case AV_CODEC_ID_RV10:
+ m->encode_picture_header = ff_rv10_encode_picture_header;
s->out_format = FMT_H263;
avctx->delay = 0;
s->low_delay = 1;
break;
+#endif
+#if CONFIG_RV20_ENCODER
case AV_CODEC_ID_RV20:
+ m->encode_picture_header = ff_rv20_encode_picture_header;
s->out_format = FMT_H263;
avctx->delay = 0;
s->low_delay = 1;
@@ -824,6 +828,7 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
s->loop_filter = 1;
s->unrestricted_mv = 0;
break;
+#endif
case AV_CODEC_ID_MPEG4:
s->out_format = FMT_H263;
s->h263_pred = 1;
@@ -996,10 +1001,10 @@ av_cold int ff_mpv_encode_init(AVCodecContext *avctx)
}
if (CONFIG_H263_ENCODER && s->out_format == FMT_H263) {
- ff_h263_encode_init(s);
+ ff_h263_encode_init(m);
#if CONFIG_MSMPEG4ENC
if (s->msmpeg4_version != MSMP4_UNUSED)
- ff_msmpeg4_encode_init(s);
+ ff_msmpeg4_encode_init(m);
#endif
}
@@ -3888,50 +3893,9 @@ static int encode_picture(MPVMainEncContext *const m, const AVPacket *pkt)
s->mb_x = s->mb_y = 0;
s->last_bits= put_bits_count(&s->pb);
- switch(s->out_format) {
-#if CONFIG_MJPEG_ENCODER || CONFIG_AMV_ENCODER
- case FMT_MJPEG:
- ff_mjpeg_amv_encode_picture_header(s);
- break;
-#endif
- case FMT_SPEEDHQ:
- if (CONFIG_SPEEDHQ_ENCODER)
- ff_speedhq_encode_picture_header(s);
- break;
- case FMT_H261:
- if (CONFIG_H261_ENCODER)
- ff_h261_encode_picture_header(s);
- break;
- case FMT_H263:
- if (CONFIG_WMV2_ENCODER && s->codec_id == AV_CODEC_ID_WMV2)
- ff_wmv2_encode_picture_header(s);
-#if CONFIG_MSMPEG4ENC
- else if (s->msmpeg4_version != MSMP4_UNUSED)
- ff_msmpeg4_encode_picture_header(s);
-#endif
- else if (CONFIG_MPEG4_ENCODER && s->h263_pred) {
- ret = ff_mpeg4_encode_picture_header(m);
- if (ret < 0)
- return ret;
- } else if (CONFIG_RV10_ENCODER && s->codec_id == AV_CODEC_ID_RV10) {
- ret = ff_rv10_encode_picture_header(s);
- if (ret < 0)
- return ret;
- }
- else if (CONFIG_RV20_ENCODER && s->codec_id == AV_CODEC_ID_RV20)
- ff_rv20_encode_picture_header(s);
- else if (CONFIG_FLV_ENCODER && s->codec_id == AV_CODEC_ID_FLV1)
- ff_flv_encode_picture_header(s);
- else if (CONFIG_H263_ENCODER)
- ff_h263_encode_picture_header(s);
- break;
- case FMT_MPEG1:
- if (CONFIG_MPEG1VIDEO_ENCODER || CONFIG_MPEG2VIDEO_ENCODER)
- ff_mpeg1_encode_picture_header(m);
- break;
- default:
- av_assert0(0);
- }
+ ret = m->encode_picture_header(m);
+ if (ret < 0)
+ return ret;
bits= put_bits_count(&s->pb);
m->header_bits = bits - s->last_bits;
diff --git a/libavcodec/mpegvideoenc.h b/libavcodec/mpegvideoenc.h
index b002ea8f2c..4a4016364c 100644
--- a/libavcodec/mpegvideoenc.h
+++ b/libavcodec/mpegvideoenc.h
@@ -74,6 +74,8 @@ typedef struct MPVMainEncContext {
int frame_skip_cmp;
me_cmp_func frame_skip_cmp_fn;
+ int (*encode_picture_header)(struct MPVMainEncContext *m);
+
/* bit rate control */
int64_t total_bits;
int frame_bits; ///< bits used for the current frame
diff --git a/libavcodec/msmpeg4enc.c b/libavcodec/msmpeg4enc.c
index 98b72e4d58..01d5707370 100644
--- a/libavcodec/msmpeg4enc.c
+++ b/libavcodec/msmpeg4enc.c
@@ -135,20 +135,6 @@ static av_cold void msmpeg4_encode_init_static(void)
}
}
-av_cold void ff_msmpeg4_encode_init(MpegEncContext *s)
-{
- static AVOnce init_static_once = AV_ONCE_INIT;
-
- ff_msmpeg4_common_init(s);
- if (s->msmpeg4_version >= MSMP4_WMV1) {
- s->min_qcoeff = -255;
- s->max_qcoeff = 255;
- }
-
- /* init various encoding tables */
- ff_thread_once(&init_static_once, msmpeg4_encode_init_static);
-}
-
static void find_best_tables(MSMPEG4EncContext *ms)
{
MpegEncContext *const s = &ms->m.s;
@@ -215,9 +201,10 @@ static void find_best_tables(MSMPEG4EncContext *ms)
}
/* write MSMPEG4 compatible frame header */
-void ff_msmpeg4_encode_picture_header(MpegEncContext * s)
+static int msmpeg4_encode_picture_header(MPVMainEncContext *const m)
{
- MSMPEG4EncContext *const ms = (MSMPEG4EncContext*)s;
+ MSMPEG4EncContext *const ms = (MSMPEG4EncContext*)m;
+ MpegEncContext *const s = &m->s;
find_best_tables(ms);
@@ -275,6 +262,8 @@ void ff_msmpeg4_encode_picture_header(MpegEncContext * s)
s->esc3_level_length= 0;
s->esc3_run_length= 0;
+
+ return 0;
}
void ff_msmpeg4_encode_ext_header(MpegEncContext * s)
@@ -674,6 +663,25 @@ void ff_msmpeg4_encode_block(MpegEncContext * s, int16_t * block, int n)
}
}
+av_cold void ff_msmpeg4_encode_init(MPVMainEncContext *const m)
+{
+ MpegEncContext *const s = &m->s;
+ static AVOnce init_static_once = AV_ONCE_INIT;
+
+ ff_msmpeg4_common_init(s);
+
+ if (s->msmpeg4_version <= MSMP4_WMV1)
+ m->encode_picture_header = msmpeg4_encode_picture_header;
+
+ if (s->msmpeg4_version >= MSMP4_WMV1) {
+ s->min_qcoeff = -255;
+ s->max_qcoeff = 255;
+ }
+
+ /* init various encoding tables */
+ ff_thread_once(&init_static_once, msmpeg4_encode_init_static);
+}
+
const FFCodec ff_msmpeg4v2_encoder = {
.p.name = "msmpeg4v2",
CODEC_LONG_NAME("MPEG-4 part 2 Microsoft variant version 2"),
diff --git a/libavcodec/msmpeg4enc.h b/libavcodec/msmpeg4enc.h
index 72992176de..5511e01283 100644
--- a/libavcodec/msmpeg4enc.h
+++ b/libavcodec/msmpeg4enc.h
@@ -33,8 +33,7 @@ typedef struct MSMPEG4EncContext {
unsigned ac_stats[2][2][MAX_LEVEL + 1][MAX_RUN + 1][2];
} MSMPEG4EncContext;
-void ff_msmpeg4_encode_init(MpegEncContext *s);
-void ff_msmpeg4_encode_picture_header(MpegEncContext *s);
+void ff_msmpeg4_encode_init(MPVMainEncContext *m);
void ff_msmpeg4_encode_ext_header(MpegEncContext *s);
void ff_msmpeg4_encode_mb(MpegEncContext *s, int16_t block[6][64],
int motion_x, int motion_y);
diff --git a/libavcodec/rv10enc.c b/libavcodec/rv10enc.c
index d55fa7c2b0..0b5065212d 100644
--- a/libavcodec/rv10enc.c
+++ b/libavcodec/rv10enc.c
@@ -31,8 +31,9 @@
#include "put_bits.h"
#include "rv10enc.h"
-int ff_rv10_encode_picture_header(MpegEncContext *s)
+int ff_rv10_encode_picture_header(MPVMainEncContext *const m)
{
+ MpegEncContext *const s = &m->s;
int full_frame= 0;
align_put_bits(&s->pb);
diff --git a/libavcodec/rv10enc.h b/libavcodec/rv10enc.h
index fc3665e839..5aa7250e87 100644
--- a/libavcodec/rv10enc.h
+++ b/libavcodec/rv10enc.h
@@ -21,9 +21,9 @@
#ifndef AVCODEC_RV10ENC_H
#define AVCODEC_RV10ENC_H
-#include "mpegvideo.h"
+typedef struct MPVMainEncContext MPVMainEncContext;
-int ff_rv10_encode_picture_header(MpegEncContext *s);
-void ff_rv20_encode_picture_header(MpegEncContext *s);
+int ff_rv10_encode_picture_header(MPVMainEncContext *m);
+int ff_rv20_encode_picture_header(MPVMainEncContext *m);
#endif /* AVCODEC_RV10ENC_H */
diff --git a/libavcodec/rv20enc.c b/libavcodec/rv20enc.c
index cacda6fdda..1a59fd4c70 100644
--- a/libavcodec/rv20enc.c
+++ b/libavcodec/rv20enc.c
@@ -34,7 +34,10 @@
#include "put_bits.h"
#include "rv10enc.h"
-void ff_rv20_encode_picture_header(MpegEncContext *s) {
+int ff_rv20_encode_picture_header(MPVMainEncContext *const m)
+{
+ MpegEncContext *const s = &m->s;
+
put_bits(&s->pb, 2, s->pict_type); //I 0 vs. 1 ?
put_bits(&s->pb, 1, 0); /* unknown bit */
put_bits(&s->pb, 5, s->qscale);
@@ -60,6 +63,7 @@ void ff_rv20_encode_picture_header(MpegEncContext *s) {
s->y_dc_scale_table=
s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
}
+ return 0;
}
const FFCodec ff_rv20_encoder = {
diff --git a/libavcodec/speedhqenc.c b/libavcodec/speedhqenc.c
index daccd0c3bf..1ba5dcc68f 100644
--- a/libavcodec/speedhqenc.c
+++ b/libavcodec/speedhqenc.c
@@ -95,9 +95,10 @@ static av_cold void speedhq_init_static_data(void)
ff_speedhq_vlc_table, uni_speedhq_ac_vlc_len);
}
-void ff_speedhq_encode_picture_header(MpegEncContext *s)
+static int speedhq_encode_picture_header(MPVMainEncContext *const m)
{
- SpeedHQEncContext *ctx = (SpeedHQEncContext*)s;
+ SpeedHQEncContext *const ctx = (SpeedHQEncContext*)m;
+ MpegEncContext *const s = &m->s;
put_bits_le(&s->pb, 8, 100 - s->qscale * 2); /* FIXME why doubled */
put_bits_le(&s->pb, 24, 4); /* no second field */
@@ -105,6 +106,8 @@ void ff_speedhq_encode_picture_header(MpegEncContext *s)
ctx->slice_start = 4;
/* length of first slice, will be filled out later */
put_bits_le(&s->pb, 24, 0);
+
+ return 0;
}
void ff_speedhq_end_slice(MpegEncContext *s)
@@ -230,7 +233,8 @@ void ff_speedhq_encode_mb(MpegEncContext *s, int16_t block[12][64])
static av_cold int speedhq_encode_init(AVCodecContext *avctx)
{
static AVOnce init_static_once = AV_ONCE_INIT;
- MpegEncContext *const s = avctx->priv_data;
+ MPVMainEncContext *const m = avctx->priv_data;
+ MpegEncContext *const s = &m->s;
int ret;
if (avctx->width > 65500 || avctx->height > 65500) {
@@ -258,6 +262,8 @@ static av_cold int speedhq_encode_init(AVCodecContext *avctx)
av_assert0(0);
}
+ m->encode_picture_header = speedhq_encode_picture_header;
+
s->min_qcoeff = -2048;
s->max_qcoeff = 2047;
diff --git a/libavcodec/speedhqenc.h b/libavcodec/speedhqenc.h
index 66ef7ee023..b0e6662279 100644
--- a/libavcodec/speedhqenc.h
+++ b/libavcodec/speedhqenc.h
@@ -36,7 +36,6 @@
void ff_speedhq_encode_close(MpegEncContext *s);
void ff_speedhq_encode_mb(MpegEncContext *s, int16_t block[12][64]);
-void ff_speedhq_encode_picture_header(MpegEncContext *s);
void ff_speedhq_end_slice(MpegEncContext *s);
static inline int ff_speedhq_mb_rows_in_slice(int slice_num, int mb_height)
diff --git a/libavcodec/wmv2enc.c b/libavcodec/wmv2enc.c
index 55fcc91484..d70a680fb3 100644
--- a/libavcodec/wmv2enc.c
+++ b/libavcodec/wmv2enc.c
@@ -73,9 +73,10 @@ static int encode_ext_header(WMV2EncContext *w)
return 0;
}
-int ff_wmv2_encode_picture_header(MpegEncContext *s)
+static int wmv2_encode_picture_header(MPVMainEncContext *const m)
{
- WMV2EncContext *const w = (WMV2EncContext *) s;
+ WMV2EncContext *const w = (WMV2EncContext *) m;
+ MpegEncContext *const s = &m->s;
put_bits(&s->pb, 1, s->pict_type - 1);
if (s->pict_type == AV_PICTURE_TYPE_I)
@@ -222,6 +223,7 @@ static av_cold int wmv2_encode_init(AVCodecContext *avctx)
MpegEncContext *const s = &w->msmpeg4.m.s;
int ret;
+ w->msmpeg4.m.encode_picture_header = wmv2_encode_picture_header;
s->private_ctx = &w->common;
ret = ff_mpv_encode_init(avctx);
if (ret < 0)
diff --git a/libavcodec/wmv2enc.h b/libavcodec/wmv2enc.h
index 263265acf3..59046c6a07 100644
--- a/libavcodec/wmv2enc.h
+++ b/libavcodec/wmv2enc.h
@@ -23,7 +23,6 @@
#include "mpegvideo.h"
-int ff_wmv2_encode_picture_header(MpegEncContext * s);
void ff_wmv2_encode_mb(MpegEncContext * s, int16_t block[6][64],
int motion_x, int motion_y);
More information about the ffmpeg-cvslog
mailing list