mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
support feeding individual NAL units to the decoder instead of just complete frames
Originally committed as revision 8197 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
700b971156
commit
66a4b2c179
@ -37,8 +37,8 @@ extern "C" {
|
|||||||
#define AV_STRINGIFY(s) AV_TOSTRING(s)
|
#define AV_STRINGIFY(s) AV_TOSTRING(s)
|
||||||
#define AV_TOSTRING(s) #s
|
#define AV_TOSTRING(s) #s
|
||||||
|
|
||||||
#define LIBAVCODEC_VERSION_INT ((51<<16)+(35<<8)+0)
|
#define LIBAVCODEC_VERSION_INT ((51<<16)+(36<<8)+0)
|
||||||
#define LIBAVCODEC_VERSION 51.35.0
|
#define LIBAVCODEC_VERSION 51.36.0
|
||||||
#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT
|
#define LIBAVCODEC_BUILD LIBAVCODEC_VERSION_INT
|
||||||
|
|
||||||
#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION)
|
#define LIBAVCODEC_IDENT "Lavc" AV_STRINGIFY(LIBAVCODEC_VERSION)
|
||||||
@ -384,6 +384,7 @@ typedef struct RcOverride{
|
|||||||
#define CODEC_FLAG2_MEMC_ONLY 0x00001000 ///< only do ME/MC (I frames -> ref, P frame -> ME+MC)
|
#define CODEC_FLAG2_MEMC_ONLY 0x00001000 ///< only do ME/MC (I frames -> ref, P frame -> ME+MC)
|
||||||
#define CODEC_FLAG2_DROP_FRAME_TIMECODE 0x00002000 ///< timecode is in drop frame format
|
#define CODEC_FLAG2_DROP_FRAME_TIMECODE 0x00002000 ///< timecode is in drop frame format
|
||||||
#define CODEC_FLAG2_SKIP_RD 0x00004000 ///< RD optimal MB level residual skiping
|
#define CODEC_FLAG2_SKIP_RD 0x00004000 ///< RD optimal MB level residual skiping
|
||||||
|
#define CODEC_FLAG2_CHUNKS 0x00008000 ///< input bitstream might be truncated at a packet boundaries instead of only at frame boundaries
|
||||||
|
|
||||||
/* Unsupported options :
|
/* Unsupported options :
|
||||||
* Syntax Arithmetic coding (SAC)
|
* Syntax Arithmetic coding (SAC)
|
||||||
|
@ -4516,6 +4516,11 @@ static int decode_slice_header(H264Context *h){
|
|||||||
|
|
||||||
first_mb_in_slice= get_ue_golomb(&s->gb);
|
first_mb_in_slice= get_ue_golomb(&s->gb);
|
||||||
|
|
||||||
|
if((s->flags2 & CODEC_FLAG2_CHUNKS) && first_mb_in_slice == 0){
|
||||||
|
h->slice_num = 0;
|
||||||
|
s->current_picture_ptr= NULL;
|
||||||
|
}
|
||||||
|
|
||||||
slice_type= get_ue_golomb(&s->gb);
|
slice_type= get_ue_golomb(&s->gb);
|
||||||
if(slice_type > 9){
|
if(slice_type > 9){
|
||||||
av_log(h->s.avctx, AV_LOG_ERROR, "slice type too large (%d) at %d %d\n", h->slice_type, s->mb_x, s->mb_y);
|
av_log(h->s.avctx, AV_LOG_ERROR, "slice type too large (%d) at %d %d\n", h->slice_type, s->mb_x, s->mb_y);
|
||||||
@ -8095,8 +8100,11 @@ static int decode_nal_units(H264Context *h, uint8_t *buf, int buf_size){
|
|||||||
av_log(NULL, AV_LOG_ERROR,"%02X ", buf[i]);
|
av_log(NULL, AV_LOG_ERROR,"%02X ", buf[i]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
if(!(s->flags2 & CODEC_FLAG2_CHUNKS)){
|
||||||
h->slice_num = 0;
|
h->slice_num = 0;
|
||||||
s->current_picture_ptr= NULL;
|
s->current_picture_ptr= NULL;
|
||||||
|
}
|
||||||
|
|
||||||
for(;;){
|
for(;;){
|
||||||
int consumed;
|
int consumed;
|
||||||
int dst_length;
|
int dst_length;
|
||||||
@ -8232,24 +8240,6 @@ static int decode_nal_units(H264Context *h, uint8_t *buf, int buf_size){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!s->current_picture_ptr) return buf_index; //no frame
|
|
||||||
|
|
||||||
s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_H264;
|
|
||||||
s->current_picture_ptr->pict_type= s->pict_type;
|
|
||||||
|
|
||||||
h->prev_frame_num_offset= h->frame_num_offset;
|
|
||||||
h->prev_frame_num= h->frame_num;
|
|
||||||
if(s->current_picture_ptr->reference){
|
|
||||||
h->prev_poc_msb= h->poc_msb;
|
|
||||||
h->prev_poc_lsb= h->poc_lsb;
|
|
||||||
}
|
|
||||||
if(s->current_picture_ptr->reference)
|
|
||||||
execute_ref_pic_marking(h, h->mmco, h->mmco_index);
|
|
||||||
|
|
||||||
ff_er_frame_end(s);
|
|
||||||
|
|
||||||
MPV_frame_end(s);
|
|
||||||
|
|
||||||
return buf_index;
|
return buf_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8365,23 +8355,36 @@ static int decode_frame(AVCodecContext *avctx,
|
|||||||
if(buf_index < 0)
|
if(buf_index < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if(!(s->flags2 & CODEC_FLAG2_CHUNKS) || (s->mb_y >= s->mb_height && s->mb_height)){
|
||||||
|
Picture *out = s->current_picture_ptr;
|
||||||
|
Picture *cur = s->current_picture_ptr;
|
||||||
|
Picture *prev = h->delayed_output_pic;
|
||||||
|
int i, pics, cross_idr, out_of_order, out_idx;
|
||||||
|
|
||||||
|
s->mb_y= 0;
|
||||||
|
|
||||||
|
s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_H264;
|
||||||
|
s->current_picture_ptr->pict_type= s->pict_type;
|
||||||
|
|
||||||
|
h->prev_frame_num_offset= h->frame_num_offset;
|
||||||
|
h->prev_frame_num= h->frame_num;
|
||||||
|
if(s->current_picture_ptr->reference){
|
||||||
|
h->prev_poc_msb= h->poc_msb;
|
||||||
|
h->prev_poc_lsb= h->poc_lsb;
|
||||||
|
}
|
||||||
|
if(s->current_picture_ptr->reference)
|
||||||
|
execute_ref_pic_marking(h, h->mmco, h->mmco_index);
|
||||||
|
|
||||||
|
ff_er_frame_end(s);
|
||||||
|
|
||||||
|
MPV_frame_end(s);
|
||||||
|
|
||||||
//FIXME do something with unavailable reference frames
|
//FIXME do something with unavailable reference frames
|
||||||
|
|
||||||
// if(ret==FRAME_SKIPPED) return get_consumed_bytes(s, buf_index, buf_size);
|
|
||||||
if(!s->current_picture_ptr){
|
|
||||||
av_log(h->s.avctx, AV_LOG_DEBUG, "error, NO frame\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
Picture *out = s->current_picture_ptr;
|
|
||||||
#if 0 //decode order
|
#if 0 //decode order
|
||||||
*data_size = sizeof(AVFrame);
|
*data_size = sizeof(AVFrame);
|
||||||
#else
|
#else
|
||||||
/* Sort B-frames into display order */
|
/* Sort B-frames into display order */
|
||||||
Picture *cur = s->current_picture_ptr;
|
|
||||||
Picture *prev = h->delayed_output_pic;
|
|
||||||
int i, pics, cross_idr, out_of_order, out_idx;
|
|
||||||
|
|
||||||
if(h->sps.bitstream_restriction_flag
|
if(h->sps.bitstream_restriction_flag
|
||||||
&& s->avctx->has_b_frames < h->sps.num_reorder_frames){
|
&& s->avctx->has_b_frames < h->sps.num_reorder_frames){
|
||||||
|
Loading…
Reference in New Issue
Block a user