aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2010-01-07 06:25:41 +0000
committerMichael Niedermayer <michaelni@gmx.at>2010-01-07 06:25:41 +0000
commitd7525cba23654452346c1c16456e53b3bd206ba0 (patch)
tree7632fe82f8de00e4e04d41d81c91c617d65a61d1 /libavcodec
parent515a5438096aec9a097de6821ff625ca605e89ee (diff)
downloadffmpeg-d7525cba23654452346c1c16456e53b3bd206ba0.tar.gz
Split out intel H263 decoder.
Originally committed as revision 21054 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/Makefile2
-rw-r--r--libavcodec/h263.c99
-rw-r--r--libavcodec/h263dec.c16
-rw-r--r--libavcodec/intelh263dec.c131
-rw-r--r--libavcodec/mpegvideo.h3
5 files changed, 137 insertions, 114 deletions
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index c0d633a23b..0fc153c170 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -124,7 +124,7 @@ OBJS-$(CONFIG_H261_ENCODER) += h261enc.o h261.o \
mpegvideo_enc.o motion_est.o \
ratecontrol.o mpeg12data.o \
mpegvideo.o
-OBJS-$(CONFIG_H263_DECODER) += h263dec.o h263.o flvdec.o\
+OBJS-$(CONFIG_H263_DECODER) += h263dec.o h263.o flvdec.o intelh263dec.o \
mpegvideo.o error_resilience.o
OBJS-$(CONFIG_H263_VAAPI_HWACCEL) += vaapi_mpeg4.o
OBJS-$(CONFIG_H263_ENCODER) += mpegvideo_enc.o motion_est.o \
diff --git a/libavcodec/h263.c b/libavcodec/h263.c
index 0576eec8e6..0065dbebdc 100644
--- a/libavcodec/h263.c
+++ b/libavcodec/h263.c
@@ -133,7 +133,7 @@ int h263_get_picture_format(int width, int height)
return 7;
}
-static void show_pict_info(MpegEncContext *s){
+void ff_h263_show_pict_info(MpegEncContext *s){
av_log(s->avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s%s %d/%d\n",
s->qscale, av_get_pict_type_char(s->pict_type),
s->gb.size_in_bits, 1-s->no_rounding,
@@ -5359,7 +5359,7 @@ int h263_decode_picture_header(MpegEncContext *s)
}
if(s->avctx->debug&FF_DEBUG_PICT_INFO){
- show_pict_info(s);
+ ff_h263_show_pict_info(s);
}
if (s->pict_type == FF_I_TYPE && s->codec_tag == AV_RL32("ZYGO")){
int i,j;
@@ -6064,98 +6064,3 @@ end:
s->avctx->has_b_frames= !s->low_delay;
return decode_vop_header(s, gb);
}
-
-/* don't understand why they choose a different header ! */
-int intel_h263_decode_picture_header(MpegEncContext *s)
-{
- int format;
-
- /* picture header */
- if (get_bits_long(&s->gb, 22) != 0x20) {
- av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
- return -1;
- }
- s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
-
- if (get_bits1(&s->gb) != 1) {
- av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
- return -1; /* marker */
- }
- if (get_bits1(&s->gb) != 0) {
- av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
- return -1; /* h263 id */
- }
- skip_bits1(&s->gb); /* split screen off */
- skip_bits1(&s->gb); /* camera off */
- skip_bits1(&s->gb); /* freeze picture release off */
-
- format = get_bits(&s->gb, 3);
- if (format != 7) {
- av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n");
- return -1;
- }
- s->h263_plus = 0;
-
- s->pict_type = FF_I_TYPE + get_bits1(&s->gb);
-
- s->unrestricted_mv = get_bits1(&s->gb);
- s->h263_long_vectors = s->unrestricted_mv;
-
- if (get_bits1(&s->gb) != 0) {
- av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n");
- return -1; /* SAC: off */
- }
- s->obmc= get_bits1(&s->gb);
- s->pb_frame = get_bits1(&s->gb);
-
- if(format == 7){
- format = get_bits(&s->gb, 3);
- if(format == 0 || format == 7){
- av_log(s->avctx, AV_LOG_ERROR, "Wrong Intel H263 format\n");
- return -1;
- }
- if(get_bits(&s->gb, 2))
- av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
- s->loop_filter = get_bits1(&s->gb);
- if(get_bits1(&s->gb))
- av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
- if(get_bits1(&s->gb))
- s->pb_frame = 2;
- if(get_bits(&s->gb, 5))
- av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
- if(get_bits(&s->gb, 5) != 1)
- av_log(s->avctx, AV_LOG_ERROR, "Invalid marker\n");
- }
- if(format == 6){
- int ar = get_bits(&s->gb, 4);
- skip_bits(&s->gb, 9); // display width
- skip_bits1(&s->gb);
- skip_bits(&s->gb, 9); // display height
- if(ar == 15){
- skip_bits(&s->gb, 8); // aspect ratio - width
- skip_bits(&s->gb, 8); // aspect ratio - height
- }
- }
-
- s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
- skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
-
- if(s->pb_frame){
- skip_bits(&s->gb, 3); //temporal reference for B-frame
- skip_bits(&s->gb, 2); //dbquant
- }
-
- /* PEI */
- while (get_bits1(&s->gb) != 0) {
- skip_bits(&s->gb, 8);
- }
- s->f_code = 1;
-
- s->y_dc_scale_table=
- s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
-
- if(s->avctx->debug&FF_DEBUG_PICT_INFO)
- show_pict_info(s);
-
- return 0;
-}
diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index dda414d504..e63a210474 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -414,7 +414,7 @@ retry:
}
ret = ff_mpeg4_decode_picture_header(s, &s->gb);
} else if (s->codec_id == CODEC_ID_H263I) {
- ret = intel_h263_decode_picture_header(s);
+ ret = ff_intel_h263_decode_picture_header(s);
} else if (CONFIG_FLV_DECODER && s->h263_flv) {
ret = ff_flv_decode_picture_header(s);
} else {
@@ -817,20 +817,6 @@ AVCodec wmv1_decoder = {
.pix_fmts= ff_pixfmt_list_420,
};
-AVCodec h263i_decoder = {
- "h263i",
- CODEC_TYPE_VIDEO,
- CODEC_ID_H263I,
- sizeof(MpegEncContext),
- ff_h263_decode_init,
- NULL,
- ff_h263_decode_end,
- ff_h263_decode_frame,
- CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
- .long_name = NULL_IF_CONFIG_SMALL("Intel H.263"),
- .pix_fmts= ff_pixfmt_list_420,
-};
-
#if CONFIG_MPEG4_VDPAU_DECODER
AVCodec mpeg4_vdpau_decoder = {
"mpeg4_vdpau",
diff --git a/libavcodec/intelh263dec.c b/libavcodec/intelh263dec.c
new file mode 100644
index 0000000000..4a0078b8c4
--- /dev/null
+++ b/libavcodec/intelh263dec.c
@@ -0,0 +1,131 @@
+/*
+ * H.263i decoder
+ *
+ * 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 "mpegvideo.h"
+
+/* don't understand why they choose a different header ! */
+int ff_intel_h263_decode_picture_header(MpegEncContext *s)
+{
+ int format;
+
+ /* picture header */
+ if (get_bits_long(&s->gb, 22) != 0x20) {
+ av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
+ return -1;
+ }
+ s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
+
+ if (get_bits1(&s->gb) != 1) {
+ av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
+ return -1; /* marker */
+ }
+ if (get_bits1(&s->gb) != 0) {
+ av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n");
+ return -1; /* h263 id */
+ }
+ skip_bits1(&s->gb); /* split screen off */
+ skip_bits1(&s->gb); /* camera off */
+ skip_bits1(&s->gb); /* freeze picture release off */
+
+ format = get_bits(&s->gb, 3);
+ if (format != 7) {
+ av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n");
+ return -1;
+ }
+ s->h263_plus = 0;
+
+ s->pict_type = FF_I_TYPE + get_bits1(&s->gb);
+
+ s->unrestricted_mv = get_bits1(&s->gb);
+ s->h263_long_vectors = s->unrestricted_mv;
+
+ if (get_bits1(&s->gb) != 0) {
+ av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n");
+ return -1; /* SAC: off */
+ }
+ s->obmc= get_bits1(&s->gb);
+ s->pb_frame = get_bits1(&s->gb);
+
+ if(format == 7){
+ format = get_bits(&s->gb, 3);
+ if(format == 0 || format == 7){
+ av_log(s->avctx, AV_LOG_ERROR, "Wrong Intel H263 format\n");
+ return -1;
+ }
+ if(get_bits(&s->gb, 2))
+ av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
+ s->loop_filter = get_bits1(&s->gb);
+ if(get_bits1(&s->gb))
+ av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
+ if(get_bits1(&s->gb))
+ s->pb_frame = 2;
+ if(get_bits(&s->gb, 5))
+ av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
+ if(get_bits(&s->gb, 5) != 1)
+ av_log(s->avctx, AV_LOG_ERROR, "Invalid marker\n");
+ }
+ if(format == 6){
+ int ar = get_bits(&s->gb, 4);
+ skip_bits(&s->gb, 9); // display width
+ skip_bits1(&s->gb);
+ skip_bits(&s->gb, 9); // display height
+ if(ar == 15){
+ skip_bits(&s->gb, 8); // aspect ratio - width
+ skip_bits(&s->gb, 8); // aspect ratio - height
+ }
+ }
+
+ s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
+ skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
+
+ if(s->pb_frame){
+ skip_bits(&s->gb, 3); //temporal reference for B-frame
+ skip_bits(&s->gb, 2); //dbquant
+ }
+
+ /* PEI */
+ while (get_bits1(&s->gb) != 0) {
+ skip_bits(&s->gb, 8);
+ }
+ s->f_code = 1;
+
+ s->y_dc_scale_table=
+ s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
+
+ if(s->avctx->debug&FF_DEBUG_PICT_INFO)
+ ff_h263_show_pict_info(s);
+
+ return 0;
+}
+
+AVCodec h263i_decoder = {
+ "h263i",
+ CODEC_TYPE_VIDEO,
+ CODEC_ID_H263I,
+ sizeof(MpegEncContext),
+ ff_h263_decode_init,
+ NULL,
+ ff_h263_decode_end,
+ ff_h263_decode_frame,
+ CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1,
+ .long_name = NULL_IF_CONFIG_SMALL("Intel H.263"),
+ .pix_fmts= ff_pixfmt_list_420,
+};
+
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index 48bdcfcba9..269b8c8710 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -831,8 +831,9 @@ void ff_h263_loop_filter(MpegEncContext * s);
void ff_set_qscale(MpegEncContext * s, int qscale);
int ff_h263_decode_mba(MpegEncContext *s);
void ff_h263_encode_mba(MpegEncContext *s);
+void ff_h263_show_pict_info(MpegEncContext *s);
-int intel_h263_decode_picture_header(MpegEncContext *s);
+int ff_intel_h263_decode_picture_header(MpegEncContext *s);
int ff_h263_decode_mb(MpegEncContext *s,
DCTELEM block[6][64]);
int ff_mpeg4_decode_mb(MpegEncContext *s,