procedure RenderScene; cdecl;
var
i, icnt2, j,tst, numBytes, CopyLen : LongInt;
icnt:LongInt;
pData : Pointer;
tmp,tmp2,mybuffer:Pbyte;
pReadData:Pbyte;
S :Integer;
begin
while (av_read_frame(format_context, @packet) >= 0) do
begin
WriteLn(IntToStr(packet.stream_index));
if (packet.stream_index = video_stream) then
begin
// Video stream packet
avcodec_decode_video2(codec_context, frame, @frame_finished, @packet);
if (frame_finished <> 0) then
begin
pFrameYUV420P:= av_frame_alloc();
numBytes:=avpicture_get_size(AV_PIX_FMT_RGB24, codec_context^.width, codec_context^.height);
mybuffer:=av_malloc(numBytes*sizeof(cardinal));
avpicture_fill(PAVPicture(pFrameYUV420P), mybuffer, AV_PIX_FMT_RGB32, codec_context^.width, codec_context^.height);
if not assigned(pFrameYUV420P) then
begin
writeln('Could not Allocate AVFrame structure');
exit;
end;
GetMem(pData, codec_context^.width*codec_context^.height*4);
sws_scale(img_convert_context,@frame^.data,@frame^.linesize,0,codec_context^.height,@pFrameYUV420P^.data,@pFrameYUV420P^.linesize);
Move(PByte(pFrameYUV420P^.data[0])^, pData^, codec_context^.width * 4 * (codec_context^.height-1));
if pData<>nil then;
Texture :=CreateTexture(codec_context^.width, codec_context^.height, GL_RGB, pData);
glLoadIdentity();
gluLookAt( posX, 0.0, posZ,0.0, 0.0, 0.0,0.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
av_free(pFrameYUV420P);
glutSwapBuffers;
end;
end;
av_free_packet(@packet);
end;
end;
//Init
begin
try
if (ParamCount < 1) then
filename := std_filename
else
filename := ParamStr(1);
glutInit(@argc,argv);
glutInitDisplayMode(GLUT_RGBA or GLUT_DOUBLE or GLUT_DEPTH);
glutInitWindowSize(AppWidth, AppHeight);
ScreenWidth := glutGet(GLUT_SCREEN_WIDTH);
ScreenHeight := glutGet(GLUT_SCREEN_HEIGHT);
glutInitWindowPosition((ScreenWidth - AppWidth) div 2, (ScreenHeight - AppHeight) div 2);
glutCreateWindow('Lazarus OpenGL Tutorial');
glutKeyboardFunc ( @pressKey );
InitScene;
glutDisplayFunc(@RenderScene);
glutReshapeFunc(@Reshape);
glutTimerFunc(40, @Timer, 0);
av_register_all();
avformat_network_init();
err := avformat_open_input(@format_context, PAnsiChar(filename), nil, nil);
if (err < 0) then
begin
WriteLn('ffmpeg: Unable to open input file');
Halt(1);
end;
err := avformat_find_stream_info(format_context, nil);
if (err < 0) then
begin
WriteLn('ffmpeg: Unable to find stream info');
Halt(1);
end;
av_dump_format(format_context, 0, PAnsiChar(filename), 0);
for video_stream := 0 to format_context^.nb_streams - 1 do
if (format_context^.streams[video_stream]^.codec^.codec_type = AVMEDIA_TYPE_VIDEO) then
break;
if (video_stream = format_context^.nb_streams) then
begin
WriteLn('ffmpeg: Unable to find video stream');
Halt(1);
end;
codec_context := format_context^.streams[video_stream]^.codec;
codec := avcodec_find_decoder(codec_context^.codec_id);
err := avcodec_open2(codec_context, codec, nil);
if (err < 0) then
begin
WriteLn('ffmpeg: Unable to open codec');
Halt(1);
end;
img_convert_context := sws_getContext(
codec_context^.width,
codec_context^.height,
codec_context^.pix_fmt,
codec_context^.width,
codec_context^.height,
AV_PIX_FMT_RGB24,
SWS_BILINEAR,
nil,
nil,
nil
);
if (img_convert_context = nil) then
begin
WriteLn('Cannot initialize the conversion context');
Halt(1);
end;
frame := av_frame_alloc();
glutMainLoop;
sws_freeContext(img_convert_context);
av_free(frame);
avcodec_close(codec_context);
avformat_close_input(@format_context);
avformat_network_deinit;
except
on E: Exception do
WriteLn(E.ClassName, ': ', E.Message);
end;