summaryrefslogtreecommitdiff
path: root/libavcodec/h264_parser.c
diff options
context:
space:
mode:
authorIvan Schreter <schreter@gmx.net>2009-02-21 20:03:05 +0000
committerCarl Eugen Hoyos <cehoyos@rainbow.studorg.tuwien.ac.at>2009-02-21 20:03:05 +0000
commit96c3da93e6e390539a576923a375b07cf7cfc9ef (patch)
treedef3b1b803d948cec8bb1559329d407b33b3dcb1 /libavcodec/h264_parser.c
parent0ed260c7a3e57f9407602d4c78e23f7b8b675690 (diff)
Set context variable picture_structure in H264 parser.
Patch by Ivan Schreter, schreter gmx net Originally committed as revision 17490 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/h264_parser.c')
-rw-r--r--libavcodec/h264_parser.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/libavcodec/h264_parser.c b/libavcodec/h264_parser.c
index 09f764aeae..149094a5b4 100644
--- a/libavcodec/h264_parser.c
+++ b/libavcodec/h264_parser.c
@@ -112,6 +112,7 @@ static inline int parse_nal_units(AVCodecParserContext *s,
{
H264Context *h = s->priv_data;
const uint8_t *buf_end = buf + buf_size;
+ unsigned int pps_id;
unsigned int slice_type;
int state;
const uint8_t *ptr;
@@ -164,6 +165,33 @@ static inline int parse_nal_units(AVCodecParserContext *s,
/* key frame, since recovery_frame_cnt is set */
s->key_frame = 1;
}
+ pps_id= get_ue_golomb(&h->s.gb);
+ if(pps_id>=MAX_PPS_COUNT) {
+ av_log(h->s.avctx, AV_LOG_ERROR, "pps_id out of range\n");
+ return -1;
+ }
+ if(!h->pps_buffers[pps_id]) {
+ av_log(h->s.avctx, AV_LOG_ERROR, "non-existing PPS referenced\n");
+ return -1;
+ }
+ h->pps= *h->pps_buffers[pps_id];
+ if(!h->sps_buffers[h->pps.sps_id]) {
+ av_log(h->s.avctx, AV_LOG_ERROR, "non-existing SPS referenced\n");
+ return -1;
+ }
+ h->sps = *h->sps_buffers[h->pps.sps_id];
+ h->frame_num = get_bits(&h->s.gb, h->sps.log2_max_frame_num);
+
+ if(h->sps.frame_mbs_only_flag){
+ h->s.picture_structure= PICT_FRAME;
+ }else{
+ if(get_bits1(&h->s.gb)) { //field_pic_flag
+ h->s.picture_structure= PICT_TOP_FIELD + get_bits1(&h->s.gb); //bottom_field_flag
+ } else {
+ h->s.picture_structure= PICT_FRAME;
+ }
+ }
+
return 0; /* no need to evaluate the rest */
}
buf += consumed;