summaryrefslogtreecommitdiff
path: root/libavcodec/h264.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2007-03-02 23:35:26 +0000
committerMichael Niedermayer <michaelni@gmx.at>2007-03-02 23:35:26 +0000
commit66a4b2c1798d75582c6ef5c96e92ed925b386511 (patch)
treed564967158dd37828f6df137c5538cfc6442c2af /libavcodec/h264.c
parent700b971156f17b4eb03fc7da89d3d94a46b03169 (diff)
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
Diffstat (limited to 'libavcodec/h264.c')
-rw-r--r--libavcodec/h264.c65
1 files changed, 34 insertions, 31 deletions
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 9f050fd8f9..9c568c0033 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -4516,6 +4516,11 @@ static int decode_slice_header(H264Context *h){
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);
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);
@@ -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]);
}
#endif
- h->slice_num = 0;
- s->current_picture_ptr= NULL;
+ if(!(s->flags2 & CODEC_FLAG2_CHUNKS)){
+ h->slice_num = 0;
+ s->current_picture_ptr= NULL;
+ }
+
for(;;){
int consumed;
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;
}
@@ -8365,23 +8355,36 @@ static int decode_frame(AVCodecContext *avctx,
if(buf_index < 0)
return -1;
- //FIXME do something with unavailable reference frames
+ 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;
-// 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;
- }
+ 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
- {
- Picture *out = s->current_picture_ptr;
#if 0 //decode order
*data_size = sizeof(AVFrame);
#else
/* 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
&& s->avctx->has_b_frames < h->sps.num_reorder_frames){