[Libav-user] blit swscale to texture

David martin vilanew at gmail.com
Mon Mar 19 10:14:28 CET 2012


Hi,
I'm cross posting to both SDl and ffmpeg list as this might be linked to 
both groups.
This is a code snippet works to display a video image using SDL2.0 and 
ffmpeg. This code could probably be improved and one way would be to 
directly blit into the texture.
Do you know which SDL2.0 function should i use do blit the swscale 
object into a texture without going through the two steps in the code 
below ?

if (avpacket.stream_index == videoStream) {

         		

         		avcodec_decode_video2(codec_context, frame, &frame_finished, 
&avpacket);

         		if(frame_finished)
         		{

         			

         			if(avpicture_alloc(&picture, PIX_FMT_RGB24, w,h) < 0){
         				fprintf(stderr, "problem allocating picture!\n");
         				exit(1);
         			}

         			img_convert_ctx  = sws_getCachedContext(img_convert_ctx,
         					w,
         					h,
         					codec_context->pix_fmt,
         					//PIX_FMT_YUV420P,
         					w,
         					h,
         					PIX_FMT_RGB24,
         					SWS_BICUBIC,
         					NULL,
         					NULL,
         					NULL);

         			if (img_convert_ctx == NULL)
         			{
         				fprintf(stderr, "Cannot initialize the conversion context!\n");
         				exit(1);
         			}



         			int s = sws_scale(
         					img_convert_ctx,
         					frame->data,
         					frame->linesize,
         					0,
         					h,
         					picture.data,
         					picture.linesize);

        			

SDL_Surface *image = SDL_CreateRGBSurfaceFrom(
         			        					 	 			 picture.data[0],
         			        					 	w,
         			        					 	h,
         			        					 	24,
         			        					 	w*3,
         			        					 	 rmask, gmask, bmask, amask);



      texture = SDL_CreateTextureFromSurface(renderer, image);


         		     if (SDL_RenderCopy(renderer, texture, NULL, NULL) < 0)
         		     {
         		    	 fprintf(stderr, "SDL_RenderCopy FAILED: %s\n", 
SDL_GetError());
         		    	 return -1;
         		     }


         		     SDL_RenderPresent(renderer);

         		     SDL_Delay(20); // Video delay
         		     avpicture_free(&picture);
         		     SDL_FreeSurface(image);
         		     SDL_UnlockTexture(texture);

         		}

         	}



More information about the Libav-user mailing list