[FFmpeg-devel] Fwd: get_ue_golomb_31() vs. get_ue_golomb()
    Monica Morogan 
    dmonica
       
    Thu Apr 22 23:28:47 CEST 2010
    
    
  
Hello everybody,
I use ffmpeg-0.5.1 to decode h264 streams and I am finding that the
next functions
ff_h264_decode_seq_parameter_set and
ff_h264_decode_picture_parameter_set
do not decode correctly the following sequence of SPS/PPS.
 00 00 00 01 27 42 80 1E 04 05 68 14 1F 90 00 00 00 01 28 04 00 80 E0 7F 20
The sps_id ( = get_ue_golomb_31()) returns 32 instead of the correct value 31.
Same when getting the sps_id from the PPS. Since 32 is out of the range (0-31).
the decoding stops.
I replaced get_ue_golomb_31 with get_ue_golomb and everything is
decoded properly.
However, get_ue_golomb_31 uses a lookup table, therefore, I would like
to know if there
is a corrected version of the table ff_ue_golomb_vlc_code[512] that I can use?
(In any case the changes I did and pasted below solved my problem).
Thanks for your time,
Monica
===================================================================
***************
*** 3727,3743 ****
     pps_id= get_ue_golomb(&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(!h0->pps_buffers[pps_id]) {
!         av_log(h->s.avctx, AV_LOG_ERROR, "non-existing PPS referenced\n");
         return -1;
     }
     h->pps= *h0->pps_buffers[pps_id];
     if(!h0->sps_buffers[h->pps.sps_id]) {
!         av_log(h->s.avctx, AV_LOG_ERROR, "non-existing SPS referenced\n");
         return -1;
     }
     h->sps = *h0->sps_buffers[h->pps.sps_id];
--- 3727,3743 ----
     pps_id= get_ue_golomb(&s->gb);
     if(pps_id>=MAX_PPS_COUNT){
!         av_log(h->s.avctx, AV_LOG_ERROR, "pps_id (%u) out of
range\n", pps_id);
         return -1;
     }
     if(!h0->pps_buffers[pps_id]) {
!         av_log(h->s.avctx, AV_LOG_ERROR, "non-existing PPS(%u)
referenced\n, pps_id");
         return -1;
     }
     h->pps= *h0->pps_buffers[pps_id];
     if(!h0->sps_buffers[h->pps.sps_id]) {
!         av_log(h->s.avctx, AV_LOG_ERROR, "non-existing SPS (%u)
referenced\n", h->pps.sps_id);
         return -1;
     }
     h->sps = *h0->sps_buffers[h->pps.sps_id];
***************
*** 7135,7144 ****
     get_bits1(&s->gb);   //constraint_set3_flag
     get_bits(&s->gb, 4); // reserved
     level_idc= get_bits(&s->gb, 8);
!     sps_id= get_ue_golomb_31(&s->gb);
     if(sps_id >= MAX_SPS_COUNT) {
!         av_log(h->s.avctx, AV_LOG_ERROR, "sps_id (%d) out of
range\n", sps_id);
         return -1;
     }
     sps= av_mallocz(sizeof(SPS));
--- 7135,7150 ----
     get_bits1(&s->gb);   //constraint_set3_flag
     get_bits(&s->gb, 4); // reserved
     level_idc= get_bits(&s->gb, 8);
!
!    //sps_id= get_ue_golomb_31(&s->gb);
!   // 00 00 00 01 27 42 80 1E 04 05 68 14 1F 90 00 00 00 01 28 04 00
80 E0 7F 20
!   // get_ue_golomb_31 doesn't correctly decode the sps_id from the
!   // sequence (instead of 31 returns 32 which is out of range
!   // causing the decoding to stop
!     sps_id= get_ue_golomb(&s->gb);
     if(sps_id >= MAX_SPS_COUNT) {
!         av_log(h->s.avctx, AV_LOG_ERROR, "sps_id (%u) out of
range\n", sps_id);
         return -1;
     }
     sps= av_mallocz(sizeof(SPS));
***************
*** 7274,7290 ****
     PPS *pps;
     if(pps_id >= MAX_PPS_COUNT) {
!         av_log(h->s.avctx, AV_LOG_ERROR, "pps_id (%d) out of
range\n", pps_id);
         return -1;
     }
     pps= av_mallocz(sizeof(PPS));
     if(pps == NULL)
         return -1;
!     pps->sps_id= get_ue_golomb_31(&s->gb);
!     if((unsigned)pps->sps_id>=MAX_SPS_COUNT ||
h->sps_buffers[pps->sps_id] == NULL){
!         av_log(h->s.avctx, AV_LOG_ERROR, "sps_id out of range\n");
         goto fail;
     }
--- 7280,7298 ----
     PPS *pps;
     if(pps_id >= MAX_PPS_COUNT) {
!         av_log(h->s.avctx, AV_LOG_ERROR, "pps_id (%u) out of
range\n", pps_id);
         return -1;
     }
     pps= av_mallocz(sizeof(PPS));
     if(pps == NULL)
         return -1;
!
!   //pps->sps_id= get_ue_golomb_31(&s->gb);
!   pps->sps_id= get_ue_golomb(&s->gb);
!     if((unsigned)pps->sps_id>=MAX_SPS_COUNT ||
h->sps_buffers[pps->sps_id] == NULL) {
!         av_log(h->s.avctx, AV_LOG_ERROR, "pps.sps_id (%u) out of
range\n", pps->sps_id);
         goto fail;
     }
***************
*** 7433,7444 ****
     int context_count = 0;
     h->max_contexts = avctx->thread_count;
- #if 0
     int i;
!     for(i=0; i<50; i++){
!         av_log(NULL, AV_LOG_ERROR,"%02X ", buf[i]);
!     }
! #endif
     if(!(s->flags2 & CODEC_FLAG2_CHUNKS)){
         h->current_slice = 0;
         if (!s->first_field)
--- 7441,7448 ----
     int context_count = 0;
     h->max_contexts = avctx->thread_count;
     int i;
!
     if(!(s->flags2 & CODEC_FLAG2_CHUNKS)){
         h->current_slice = 0;
         if (!s->first_field)
    
    
More information about the ffmpeg-devel
mailing list