mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Split flv decoding out.
Originally committed as revision 21051 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
eb52376915
commit
a0b0d75368
@ -124,7 +124,7 @@ OBJS-$(CONFIG_H261_ENCODER) += h261enc.o h261.o \
|
|||||||
mpegvideo_enc.o motion_est.o \
|
mpegvideo_enc.o motion_est.o \
|
||||||
ratecontrol.o mpeg12data.o \
|
ratecontrol.o mpeg12data.o \
|
||||||
mpegvideo.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
|
mpegvideo.o error_resilience.o
|
||||||
OBJS-$(CONFIG_H263_VAAPI_HWACCEL) += vaapi_mpeg4.o
|
OBJS-$(CONFIG_H263_VAAPI_HWACCEL) += vaapi_mpeg4.o
|
||||||
OBJS-$(CONFIG_H263_ENCODER) += mpegvideo_enc.o motion_est.o \
|
OBJS-$(CONFIG_H263_ENCODER) += mpegvideo_enc.o motion_est.o \
|
||||||
|
@ -23,5 +23,8 @@
|
|||||||
void ff_flv_encode_picture_header(MpegEncContext * s, int picture_number);
|
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);
|
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
|
#endif
|
||||||
|
|
||||||
|
130
libavcodec/flvdec.c
Normal file
130
libavcodec/flvdec.c
Normal file
@ -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,
|
||||||
|
};
|
@ -4428,15 +4428,8 @@ retry:
|
|||||||
}
|
}
|
||||||
if (code == rl->n) {
|
if (code == rl->n) {
|
||||||
/* escape */
|
/* escape */
|
||||||
if (s->h263_flv > 1) {
|
if (CONFIG_FLV_DECODER && s->h263_flv > 1) {
|
||||||
int is11 = get_bits1(&s->gb);
|
ff_flv2_decode_ac_esc(&s->gb, &level, &run, &last);
|
||||||
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);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
last = get_bits1(&s->gb);
|
last = get_bits1(&s->gb);
|
||||||
run = get_bits(&s->gb, 6);
|
run = get_bits(&s->gb, 6);
|
||||||
@ -6166,88 +6159,3 @@ int intel_h263_decode_picture_header(MpegEncContext *s)
|
|||||||
|
|
||||||
return 0;
|
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;
|
|
||||||
}
|
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include "mpeg4video_parser.h"
|
#include "mpeg4video_parser.h"
|
||||||
#include "msmpeg4.h"
|
#include "msmpeg4.h"
|
||||||
#include "vdpau_internal.h"
|
#include "vdpau_internal.h"
|
||||||
|
#include "flv.h"
|
||||||
|
|
||||||
//#define DEBUG
|
//#define DEBUG
|
||||||
//#define PRINT_FRAME_TIME
|
//#define PRINT_FRAME_TIME
|
||||||
@ -414,8 +415,8 @@ retry:
|
|||||||
ret = ff_mpeg4_decode_picture_header(s, &s->gb);
|
ret = ff_mpeg4_decode_picture_header(s, &s->gb);
|
||||||
} else if (s->codec_id == CODEC_ID_H263I) {
|
} else if (s->codec_id == CODEC_ID_H263I) {
|
||||||
ret = intel_h263_decode_picture_header(s);
|
ret = intel_h263_decode_picture_header(s);
|
||||||
} else if (s->h263_flv) {
|
} else if (CONFIG_FLV_DECODER && s->h263_flv) {
|
||||||
ret = flv_h263_decode_picture_header(s);
|
ret = ff_flv_decode_picture_header(s);
|
||||||
} else {
|
} else {
|
||||||
ret = h263_decode_picture_header(s);
|
ret = h263_decode_picture_header(s);
|
||||||
}
|
}
|
||||||
@ -830,20 +831,6 @@ AVCodec h263i_decoder = {
|
|||||||
.pix_fmts= ff_pixfmt_list_420,
|
.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
|
#if CONFIG_MPEG4_VDPAU_DECODER
|
||||||
AVCodec mpeg4_vdpau_decoder = {
|
AVCodec mpeg4_vdpau_decoder = {
|
||||||
"mpeg4_vdpau",
|
"mpeg4_vdpau",
|
||||||
|
@ -833,7 +833,6 @@ int ff_h263_decode_mba(MpegEncContext *s);
|
|||||||
void ff_h263_encode_mba(MpegEncContext *s);
|
void ff_h263_encode_mba(MpegEncContext *s);
|
||||||
|
|
||||||
int intel_h263_decode_picture_header(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,
|
int ff_h263_decode_mb(MpegEncContext *s,
|
||||||
DCTELEM block[6][64]);
|
DCTELEM block[6][64]);
|
||||||
int ff_mpeg4_decode_mb(MpegEncContext *s,
|
int ff_mpeg4_decode_mb(MpegEncContext *s,
|
||||||
|
Loading…
Reference in New Issue
Block a user