Hello,

I have a strange problem and do not find a solution. I try to extract a serie 
of Pictures in a MPEG2-Transport-Stream. The I-Frames are nice and ok, but 
the other frames (P- and B-frames) are corrupted. My Code is the following:

int i = 0;  // Pic Nr.
int frameFinished = 0;
    
do
{
   if (packet.stream_index == mStreamID)                // at this step I've 
already read a 
packet!
   {
        int bytesRemaining = packet.size;
        int bytesDecoded = 0;
  
        bytesDecoded = avcodec_decode_video(mPCodecCtx, frame, &frameFinished,  
                
packet.data, packet.size);

        if (frameFinished)
        {
          i++;
          
          if (i == 12)  // only 12 pictures for test
            return;
          
          cout << frame->pict_type << " dekodiert!" << endl;
        
          int numBytes=avpicture_get_size(PIX_FMT_RGB24, mPCodecCtx->width, 
mPCodecCtx->height);
          uint8_t* imgbuf = (uint8_t*) av_malloc(numBytes*sizeof(uint8_t));
    
          avpicture_fill((AVPicture *)pFrameRGB, imgbuf, PIX_FMT_RGB24, 
mPCodecCtx->width, mPCodecCtx->height);
    
          img_convert_ctx = sws_getContext(mPCodecCtx->width, 
mPCodecCtx->height,
                                           mPCodecCtx->pix_fmt,
                                           mPCodecCtx->width, 
mPCodecCtx->height,
                                           PIX_FMT_RGB24,
                                           SWS_BICUBIC, NULL, NULL, NULL);
          sws_scale(img_convert_ctx, frame->data, frame->linesize,
                    0, mPCodecCtx->height, pFrameRGB->data, 
pFrameRGB->linesize);

          // Bild als PPM speichern
          int flength = (mPCodecCtx->width * mPCodecCtx-> height * 3) + 15;
          rawframe = new uint8_t[flength+1];
          sprintf((char*)rawframe,"P6\n%d %d\n255\n", mPCodecCtx->width, 
mPCodecCtx->height);

          // dekodierten Bildinhalt kopieren
          int buf_stelle = 15;  // Nach dem PPM-Bild-Header
          for(int y=0; y<mPCodecCtx->height; y++)
          {
            memcpy(&rawframe[buf_stelle], 
pFrameRGB->data[0]+y*pFrameRGB->linesize[0], mPCodecCtx->width*3);
            buf_stelle += mPCodecCtx->width*3;
          }
          flength = buf_stelle;
          
          ostringstream Str;
          Str << i; 
          
          string filename = "pic" + Str.str() + ".ppm";
          FILE* fp = fopen(filename.c_str(),"wb");
          fwrite(rawframe, flength, 1, fp);
          fclose(fp);
        }
      }
      
      av_free_packet(&packet);
      
    } while (av_read_frame(mPAVFile->_formatContext(), &packet) >= 0);

After the extraction I get only nice I-Frames. The rest of the pictures are 
corrupted. May anyone help me?

regards,
Sven
_______________________________________________
libav-user mailing list
[email protected]
https://lists.mplayerhq.hu/mailman/listinfo/libav-user

Reply via email to