Friday, March 28, 2014

Android uses sdl1.3 play video problems.


No matter how I adjust the video screen only appears on the right side of the screen. Is SDL_Surface problem is SDL_Overlay problem also, or others? Seeking guidance. jni code:
 int SDL_Play (JNIEnv * env, jclass cls) 
{
LOGI ("ready to play using sdl");
AVFormatContext * pFormatCtx;
# Define SDL_AUDIO_BUFFER_SIZE 1024
static int sws_flags = SWS_BICUBIC;
int i;
int videoStream = -1;
AVCodecContext * pCodecCtx;
AVCodec * pCodec;
AVFrame * pFrame;
AVPacket packet;
int frameFinished;
float aspect_ratio;
AVCodecContext * aCodecCtx;
SDL_Overlay * bmp;
SDL_Surface * m_screen;
SDL_Rect rect;
SDL_Event event;


av_register_all ();
if (av_open_input_file (& pFormatCtx, "/ mnt / sdcard / test.avi", NULL, 0, NULL)! = 0)
return -1; / / Couldn't open file
LOGI ("open successful");
if (av_find_stream_info (pFormatCtx) <0)
return -1; / / Couldn't find stream information
/ / Dump information about file onto standard error
dump_format (pFormatCtx, 0, "/ mnt / sdcard / test.avi", 0);

/ / Find the first video stream
for (i = 0; i nb_streams; i + +)
{
if (pFormatCtx-> streams [i] -> codec-> codec_type == AVMEDIA_TYPE_VIDEO && videoStream <0)
{
videoStream = i;
}
}
if (videoStream == -1)
return -1; / / Didn't find a video stream

/ / Get a pointer to the codec context for the video stream

pCodecCtx = pFormatCtx-> streams [videoStream] -> codec;
pCodec = avcodec_find_decoder (pCodecCtx-> codec_id);
LOGI ("find decoder successful");
if (pCodec == NULL)
{
fprintf (stderr, "Unsupported codec / n!");
LOGI ("Unsupported codec / n!");
return -1; / / Codec not found
}
/ / Open codec
if (avcodec_open (pCodecCtx, pCodec) <0)
return -1; / / Could not open codec
LOGI ("open decoder successful");
/ / Allocate video frame
pFrame = avcodec_alloc_frame ();

uint8_t * buffer;
int numBytes;
/ / Determine required buffer size and allocate buffer
numBytes = avpicture_get_size (PIX_FMT_RGB24, pCodecCtx-> width,
pCodecCtx-> height);
buffer = (uint8_t *) av_malloc (numBytes * sizeof (uint8_t));
/ / Must be, otherwise fatal signal. m_screen can not assign addresses
SDL_Android_Init (env, cls);

if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER))
{
fprintf (stderr, "Could not initialize SDL -% s / n", SDL_GetError ());
LOGI ("Could not initialize SDL -% s / n");
exit (1);
}
LOGI ("SDL init successful");

LOGI ("pCodecCtx addr: 0x% x", pCodecCtx);
m_screen = SDL_SetVideoMode (/ * pCodecCtx-> width * / 320, / * pCodecCtx-> height * / 480, 24, SDL_HWSURFACE | SDL_DOUBLEBUF);
LOGI ("m_screen addr: 0x% x", m_screen);

if (! m_screen)
{
fprintf (stderr, "SDL: could not set video mode - exiting / n");
LOGI ("SDL: could not set video mode - exiting / n");
exit (1);
}
LOGI ("set video mode successful");
bmp = SDL_CreateYUVOverlay (/ * pCodecCtx-> width * / 320, / * pCodecCtx-> height * / 480,
SDL_YV12_OVERLAY, m_screen);
/ / Second
/ / SDL_Overlay * overlay2 = SDL_CreateYUVOverlay (/ * pCodecCtx-> width * / 320, / * pCodecCtx-> height * / 480,
/ / SDL_YV12_OVERLAY, m_screen);
LOGI ("Create YUV Overlay successful");
static struct SwsContext * img_convert_ctx;
if (img_convert_ctx == NULL)
{
img_convert_ctx = sws_getContext (pCodecCtx-> width, pCodecCtx-> height,
pCodecCtx-> pix_fmt,
/ * PCodecCtx-> width * / 320, / * pCodecCtx-> height * / 480,
PIX_FMT_YUV420P,
sws_flags, NULL, NULL, NULL);
if (img_convert_ctx == NULL)
{
fprintf (stderr, "Cannot initialize the conversion context / n");
LOGI ("Cannot initialize the conversion context / n");
exit (1);
}
}
i = 0;
while (av_read_frame (pFormatCtx, & packet)> = 0)
{
/ / Is this a packet from the video stream?
if (packet.stream_index == videoStream)
{
/ / Decode video frame
avcodec_decode_video2 (pCodecCtx, pFrame, & frameFinished, & packet);
/ / Did we get a video frame?
if (frameFinished)
{
/ / Convert the image from its native format to RGB
/ * Sws_scale (img_convert_ctx, pFrame-> data, pFrame-> linesize,
0, pCodecCtx-> height, pFrameRGB-> data, pFrameRGB-> linesize); * /
/ / Save the frame to disk
/ * If (+ + i <= 5)
SaveFrame (pFrameRGB, pCodecCtx-> width, pCodecCtx-> height, i); * /
SDL_LockYUVOverlay (bmp);
/ / SDL_LockYUVOverlay (overlay2);
AVPicture pict;
/ / AVPicture pic2;
pict.data [0] = bmp-> pixels [0];
pict.data [1] = bmp-> pixels [2];
pict.data [2] = bmp-> pixels [1];

pict.linesize [0] = bmp-> pitches [0];
pict.linesize [1] = bmp-> pitches [2];
pict.linesize [2] = bmp-> pitches [1];
/ / /
/ / Pic2.data [0] = overlay2-> pixels [0];
/ / Pic2.data [1] = overlay2-> pixels [2];
/ / Pic2.data [2] = overlay2-> pixels [1];

/ / Pic2.linesize [0] = overlay2-> pitches [0];
/ / Pic2.linesize [1] = overlay2-> pitches [2];
/ / Pic2.linesize [2] = overlay2-> pitches [1];
/ / Convert the image into YUV format that SDL uses
/ * Img_convert (& pict, PIX_FMT_YUV420P,
(AVPicture *) pFrame, pCodecCtx-> pix_fmt,
pCodecCtx-> width, pCodecCtx-> height); * /
sws_scale (img_convert_ctx, pFrame-> data, pFrame-> linesize,
0, pCodecCtx-> height, pict.data, pict.linesize);
/ / Second
/ / Sws_scale (img_convert_ctx, pFrame-> data, pFrame-> linesize,
/ / 0, pCodecCtx-> height, pic2.data, pic2.linesize);
/ / SDL_UnlockYUVOverlay (overlay2);
SDL_UnlockYUVOverlay (bmp);
/ / First
rect.x = 0;
rect.y = 100;
rect.w = 320;
rect.h = 320;
/ / Rect.w = 100;
/ / Rect.h = 100;
/ / Second
/ / SDL_Rect R;
/ / Rx = 120;
/ / Ry = 120;
/ / Rect.w = pCodecCtx-> width;
/ / Rect.h = pCodecCtx-> height;
/ / Rw = 100;
/ / Rh = 100;
SDL_DisplayYUVOverlay (bmp, & rect);
/ / SDL_DisplayYUVOverlay (overlay2, & R);
/ / Sleep (60);
}
}

/ / Free the packet that was allocated by av_read_frame
av_free_packet (& packet);

SDL_PollEvent (& event);
switch (event.type)
{
case SDL_QUIT:
SDL_Quit ();
exit (0);
break;
default: break;
}
};
/ / Free the RGB image
av_free (buffer);
/ / Av_free (pFrameRGB);
/ / Free the YUV frame
av_free (pFrame);
/ / Close the codec
avcodec_close (pCodecCtx);
/ / Close the video file
av_close_input_file (pFormatCtx);
return 0;

}
<-! Main posts under Banner (D4) -><-! Posts under the main text (D5) ->
Reply:

Reply:
Top. Ask God to help.
Reply:
This is how you layout file layout? I have solved.
Reply:
reference to the third floor eastlhu reply:
you this layout file is how the layout? I have solved.
fixed up with sdl2.0
Reply:
android player is that the demo using sdl offer?

No comments:

Post a Comment