summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2010-01-07 05:36:45 +0000
committerMichael Niedermayer <michaelni@gmx.at>2010-01-07 05:36:45 +0000
commita0b0d75368c603671379de73993404955ca96079 (patch)
tree4a802b5bdaefbc7382a47e8011184d3942492bb3
parenteb52376915cb518220264962fdbcf22418e790bb (diff)
Split flv decoding out.
Originally committed as revision 21051 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/Makefile2
-rw-r--r--libavcodec/flv.h3
-rw-r--r--libavcodec/flvdec.c130
-rw-r--r--libavcodec/h263.c96
-rw-r--r--libavcodec/h263dec.c19
-rw-r--r--libavcodec/mpegvideo.h1
6 files changed, 139 insertions, 112 deletions
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 117f5c1d5b..c0d633a23b 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 \
+OBJS-$(CONFIG_H263_DECODER) += h263dec.o h263.o flvdec.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/flv.h b/libavcodec/flv.h
index 848c92df98..e12b3b0268 100644
--- a/libavcodec/flv.h
+++ b/libavcodec/flv.h
@@ -23,5 +23,8 @@
void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number);
void ff_flv2_encode_ac_esc(PutBitContext *pb, int slevel, int level, int run, int last);
+int ff_flv_decode_picture_header(MpegEncContext *s);
+void ff_flv2_decode_ac_esc(GetBitContext *gb, int *level, int *run, int *last);
+
#endif
diff --git a/libavcodec/flvdec.c b/libavcodec/flvdec.c
new file mode 100644
index 0000000000..9095cb6b00
--- /dev/null
+++ b/libavcodec/flvdec.c
@@ -0,0 +1,130 @@
+/*
+ * FLV decoding.
+ * 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"
+
+void ff_flv2_decode_ac_esc(GetBitContext *gb, int *level, int *run, int *last){
+ int is11 = get_bits1(gb);
+ *last = get_bits1(gb);
+ *run = get_bits(gb, 6);
+ if(is11){
+ *level = get_sbits(gb, 11);
+ } else {
+ *level = get_sbits(gb, 7);
+ }
+}
+
+int ff_flv_decode_picture_header(MpegEncContext *s)
+{
+ int format, width, height;
+
+ /* picture header */
+ if (get_bits_long(&s->gb, 17) != 1) {
+ av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
+ return -1;
+ }
+ format = get_bits(&s->gb, 5);
+ if (format != 0 && format != 1) {
+ av_log(s->avctx, AV_LOG_ERROR, "Bad picture format\n");
+ return -1;
+ }
+ s->h263_flv = format+1;
+ s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
+ format = get_bits(&s->gb, 3);
+ switch (format) {
+ case 0:
+ width = get_bits(&s->gb, 8);
+ height = get_bits(&s->gb, 8);
+ break;
+ case 1:
+ width = get_bits(&s->gb, 16);
+ height = get_bits(&s->gb, 16);
+ break;
+ case 2:
+ width = 352;
+ height = 288;
+ break;
+ case 3:
+ width = 176;
+ height = 144;
+ break;
+ case 4:
+ width = 128;
+ height = 96;
+ break;
+ case 5:
+ width = 320;
+ height = 240;
+ break;
+ case 6:
+ width = 160;
+ height = 120;
+ break;
+ default:
+ width = height = 0;
+ break;
+ }
+ if(avcodec_check_dimensions(s->avctx, width, height))
+ return -1;
+ s->width = width;
+ s->height = height;
+
+ s->pict_type = FF_I_TYPE + get_bits(&s->gb, 2);
+ s->dropable= s->pict_type > FF_P_TYPE;
+ if (s->dropable)
+ s->pict_type = FF_P_TYPE;
+
+ skip_bits1(&s->gb); /* deblocking flag */
+ s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
+
+ s->h263_plus = 0;
+
+ s->unrestricted_mv = 1;
+ s->h263_long_vectors = 0;
+
+ /* PEI */
+ while (get_bits1(&s->gb) != 0) {
+ skip_bits(&s->gb, 8);
+ }
+ s->f_code = 1;
+
+ if(s->avctx->debug & FF_DEBUG_PICT_INFO){
+ av_log(s->avctx, AV_LOG_DEBUG, "%c esc_type:%d, qp:%d num:%d\n",
+ s->dropable ? 'D' : av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);
+ }
+
+ s->y_dc_scale_table=
+ s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
+
+ return 0;
+}
+
+AVCodec flv_decoder = {
+ "flv",
+ CODEC_TYPE_VIDEO,
+ CODEC_ID_FLV1,
+ 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("Flash Video (FLV) / Sorenson Spark / Sorenson H.263"),
+ .pix_fmts= ff_pixfmt_list_420,
+};
diff --git a/libavcodec/h263.c b/libavcodec/h263.c
index 67d01dc246..0576eec8e6 100644
--- a/libavcodec/h263.c
+++ b/libavcodec/h263.c
@@ -4428,15 +4428,8 @@ retry:
}
if (code == rl->n) {
/* escape */
- if (s->h263_flv > 1) {
- int is11 = get_bits1(&s->gb);
- last = get_bits1(&s->gb);
- run = get_bits(&s->gb, 6);
- if(is11){
- level = get_sbits(&s->gb, 11);
- } else {
- level = get_sbits(&s->gb, 7);
- }
+ if (CONFIG_FLV_DECODER && s->h263_flv > 1) {
+ ff_flv2_decode_ac_esc(&s->gb, &level, &run, &last);
} else {
last = get_bits1(&s->gb);
run = get_bits(&s->gb, 6);
@@ -6166,88 +6159,3 @@ int intel_h263_decode_picture_header(MpegEncContext *s)
return 0;
}
-
-int flv_h263_decode_picture_header(MpegEncContext *s)
-{
- int format, width, height;
-
- /* picture header */
- if (get_bits_long(&s->gb, 17) != 1) {
- av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
- return -1;
- }
- format = get_bits(&s->gb, 5);
- if (format != 0 && format != 1) {
- av_log(s->avctx, AV_LOG_ERROR, "Bad picture format\n");
- return -1;
- }
- s->h263_flv = format+1;
- s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
- format = get_bits(&s->gb, 3);
- switch (format) {
- case 0:
- width = get_bits(&s->gb, 8);
- height = get_bits(&s->gb, 8);
- break;
- case 1:
- width = get_bits(&s->gb, 16);
- height = get_bits(&s->gb, 16);
- break;
- case 2:
- width = 352;
- height = 288;
- break;
- case 3:
- width = 176;
- height = 144;
- break;
- case 4:
- width = 128;
- height = 96;
- break;
- case 5:
- width = 320;
- height = 240;
- break;
- case 6:
- width = 160;
- height = 120;
- break;
- default:
- width = height = 0;
- break;
- }
- if(avcodec_check_dimensions(s->avctx, width, height))
- return -1;
- s->width = width;
- s->height = height;
-
- s->pict_type = FF_I_TYPE + get_bits(&s->gb, 2);
- s->dropable= s->pict_type > FF_P_TYPE;
- if (s->dropable)
- s->pict_type = FF_P_TYPE;
-
- skip_bits1(&s->gb); /* deblocking flag */
- s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
-
- s->h263_plus = 0;
-
- s->unrestricted_mv = 1;
- s->h263_long_vectors = 0;
-
- /* PEI */
- while (get_bits1(&s->gb) != 0) {
- skip_bits(&s->gb, 8);
- }
- s->f_code = 1;
-
- if(s->avctx->debug & FF_DEBUG_PICT_INFO){
- av_log(s->avctx, AV_LOG_DEBUG, "%c esc_type:%d, qp:%d num:%d\n",
- s->dropable ? 'D' : av_get_pict_type_char(s->pict_type), s->h263_flv-1, s->qscale, s->picture_number);
- }
-
- s->y_dc_scale_table=
- s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
-
- return 0;
-}
diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index 8a903f2fb2..dda414d504 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -33,6 +33,7 @@
#include "mpeg4video_parser.h"
#include "msmpeg4.h"
#include "vdpau_internal.h"
+#include "flv.h"
//#define DEBUG
//#define PRINT_FRAME_TIME
@@ -414,8 +415,8 @@ 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);
- } else if (s->h263_flv) {
- ret = flv_h263_decode_picture_header(s);
+ } else if (CONFIG_FLV_DECODER && s->h263_flv) {
+ ret = ff_flv_decode_picture_header(s);
} else {
ret = h263_decode_picture_header(s);
}
@@ -830,20 +831,6 @@ AVCodec h263i_decoder = {
.pix_fmts= ff_pixfmt_list_420,
};
-AVCodec flv_decoder = {
- "flv",
- CODEC_TYPE_VIDEO,
- CODEC_ID_FLV1,
- 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("Flash Video (FLV) / Sorenson Spark / Sorenson H.263"),
- .pix_fmts= ff_pixfmt_list_420,
-};
-
#if CONFIG_MPEG4_VDPAU_DECODER
AVCodec mpeg4_vdpau_decoder = {
"mpeg4_vdpau",
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index 77e29b3d6d..48bdcfcba9 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -833,7 +833,6 @@ int ff_h263_decode_mba(MpegEncContext *s);
void ff_h263_encode_mba(MpegEncContext *s);
int intel_h263_decode_picture_header(MpegEncContext *s);
-int flv_h263_decode_picture_header(MpegEncContext *s);
int ff_h263_decode_mb(MpegEncContext *s,
DCTELEM block[6][64]);
int ff_mpeg4_decode_mb(MpegEncContext *s,