
Recherche avancée
Autres articles (70)
-
Personnaliser en ajoutant son logo, sa bannière ou son image de fond
5 septembre 2013, parCertains thèmes prennent en compte trois éléments de personnalisation : l’ajout d’un logo ; l’ajout d’une bannière l’ajout d’une image de fond ;
-
Ecrire une actualité
21 juin 2013, parPrésentez les changements dans votre MédiaSPIP ou les actualités de vos projets sur votre MédiaSPIP grâce à la rubrique actualités.
Dans le thème par défaut spipeo de MédiaSPIP, les actualités sont affichées en bas de la page principale sous les éditoriaux.
Vous pouvez personnaliser le formulaire de création d’une actualité.
Formulaire de création d’une actualité Dans le cas d’un document de type actualité, les champs proposés par défaut sont : Date de publication ( personnaliser la date de publication ) (...) -
Publier sur MédiaSpip
13 juin 2013Puis-je poster des contenus à partir d’une tablette Ipad ?
Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir
Sur d’autres sites (11427)
-
ffmpeg in child process doesn't exit when parent closes pipe
28 mars 2013, par user2221129This code snippet is from a pthread process. It is responsible for reading configuration/options to pass to ffmpeg. The data piped to ffmpeg is coming in on a ring buffer of video frames (as a proof of concept, in the final implementation these would be coming from a camera device). The parent writes to the child via a pipe established with dup2. The problem I'm having is that most of the time, the ffmpeg process doesn't seem to recognize the pipe has been closed by the parent (as strace shows the ffmpeg is in read). There are probably some unhandled mutex situations.
#define CHILD_READ writepipe[0]
#define PARENT_WRITE writepipe[1]
#define MAX_VIDEO_BUFFERS 30
static int last_frame_written = -1;
static int buffer_size = -1;
static void *video_buffer[MAX_VIDEO_BUFFERS];
#define MAXTHREADS 2
static pthread_t thread[MAXTHREADS];
static int sigusr[MAXTHREADS];
static int sigusr_thread[MAXTHREADS];
#define MAXPARAMETERS 100
void* encoder_thread(void *ptr)
{
int param;
const char **parameters = new const char* [MAXPARAMETERS];
ssize_t bytes_written_debug = 0;
int writepipe[2] = {-1,-1};
int last_frame_read = -1;
pid_t childpid;
// xxx
if ( 0 != pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL) )
{
fprintf(stderr,"pthread_setcancelstate could not be set\n");
}
param = *(int*)ptr;
fprintf(stderr,"param = %d\n", param);
switch (param)
{
...read config file and populate parameters for child call...
}
while ( last_frame_written == -1 )
{
fprintf(stderr,"ENCODER THREAD WAITING\n");
sleep(1);
}
if ( pipe(writepipe) < 0 )
{
...handle error case...
}
if ( (childpid = fork()) < 0)
{
fprintf(stderr,"child failed\n");
}
else if ( 0 == childpid ) /* in the child */
{
dup2(CHILD_READ, STDIN_FILENO);
//close(CHILD_READ); // doesn't seem to matter
close(PARENT_WRITE);
execv("/usr/bin/ffmpeg",(char **)parameters);
return;
}
else /* in the parent */
{
fprintf(stderr,"THREAD CHILD PID: %d\n",childpid);
close(CHILD_READ);
while ( last_frame_written > -1 && 0==sigusr_thread[param] )
{
if ( last_frame_read != last_frame_written )
{
// send frame to child (ffmpeg)
last_frame_read = last_frame_written;
bytes_written_debug = write(PARENT_WRITE,video_buffer[last_frame_read], buffer_size);
if ( bytes_written_debug < 0 )
{
fprintf(stderr, "write error\n");
break;
}
}
usleep(10000); // assume ~100Hz rate
}
/// Problems begin now: no more data from main process,
/// Shouldn't this close "close" the pipe created with dup2 and hence EOF ffmpeg?
if ( close(PARENT_WRITE) )
{
fprintf(stderr,"\n\nclose failure! wtf?\n\n\n");
}
// debug sleep:
// waiting 10 sec doesn't seem to help...
// trying to give ffmpeg some time if it needs it
sleep(10);
// kill never fails here:
if ( !kill(childpid,SIGINT) )
{
fprintf(stderr, "\n\nkill child %d\n", childpid);
}
else
{
fprintf(stderr, "\n\nkill failed for child %d\n", childpid);
}
fprintf(stderr,"\n\nwaiting\n\n\n");
int status = 0;
// wait forever (in most cases); ps -axw shows all the ffmpeg's
wait(&status);
}
}
int main()
{
...
for ( int i = 0; i < MAXTHREADS; ++i)
{
sigusr[i] = 0;
sigusr_thread[i] = 0;
param[i] = i;
iret = pthread_create( &thread[i], NULL, encoder_thread, (void*) &param[i] );
}
...
// Maybe this is important to the pthread signaling?
// Don't think so because thread's SIGINT isn't picked up by signal handler (not shown)
sigemptyset(&set);
sigaddset(&set, SIGHUP);
sigaddset(&set, SIGINT);
sigaddset(&set, SIGUSR1);
sigaddset(&set, SIGUSR2);
sigaddset(&set, SIGALRM);
/* block out these signals */
sigprocmask(SIG_BLOCK, &set, NULL);
...read file/populate frame buffer until file exhausted...
fprintf(stderr, "waiting for threads to exit\n");
for ( int i = 0; i < MAXTHREADS; ++i)
{
sigusr_thread[i] = 1;
pthread_join( thread[i], NULL);
}
fprintf(stderr, "done waiting for threads to exit\n");
...
return 0;
}I've embedded comments and questions in the thread's parent code after the frame buffer read/write loop.
Hope I've provided enough detail - stackoverflow posting noob ! Thank you.
-
Is 'Android+FFMpeg' friendship really available ?
26 janvier 2016, par vold_byThe question does not mean that I’m interested if ffmpeg code can be used on Andoid. I know that it can. I’m just asking if somebody has the real performance progress with that stuff.
I’ve created the question after several weeks of experiments with the stuff and I’ve had enough...
I do not want to write to branches where people even do not say what kind of video they decode (resolution, codec) and talk only about some mystical FPS. I just don’t understand what they want to do. Also I’m not going to develop application only for my phone or for Android 2.2++ phones that have some extended OpenGL features. I have quite popular phone HTC Desire so if the application does not work on it, so what’s next ?Well, what do I have ?
-
FFMpeg source from the latest HEAD branch. Actually I could not buld it with NDK5 so I decided to use stolen one.
-
Bambuser’s build script (bash) with appropriate ffmpeg source ([web] : http://bambuser.com/r/opensource/ffmpeg-4f7d2fe-android-2011-03-07.tar.gz).
It builds well after some corrections by using NDK5. -
Rockplayer’s gelded ffmpeg source code with huge Android.mk in the capacity of build script ([web] : http://www.rockplayer.com/download/rockplayer_ffmpeg_git_20100418.zip).
It builds by NDK3 and NDK5 after some corrections. Rockplayer is probably the most cool media player for Android and I supposed that I would have some perks using it’s build.
I had suitable video for a project (is not big and is not small) : 600x360 H.264.
Both libraries we got from clauses 2 and 3 provide us possibility to get frames from video (frame-by-frame, seek etc.). I did not try to get an audio track because I did not need one for the project. I’m not publishing my source here because I think that’s traditional and it’s easy to find.
Well, what’s the results with video ?
HTC Desire, Android 2.2
600x360, H.264
decoding and rendering are in different threads- Bambuser (NDK5 buld for armv5te, RGBA8888) : 33 ms/frame average.
- Rockplayer (NDK3 build for neon, RGB565) : 27 ms/frame average.
It’s not bad for the first look, but just think that these are results only to decode frames.
If somebody has much better results with decoding time, let me know.The most hard thing for a video is rendering. If we have bitmap 600x360 we should scale one somehow before painting because different phones have different screen sizes and we can not expect that our video will be the same size as screen.
What options do we have to rescale a frame to fit it to screen ?
I was able to check (the same phone and video source) those cases :- sws_scale() C function in Bambuser’s build : 70 ms/frame. Unacceptable.
- Stupid bitmap rescaling in Android (Bitmap.createScaledBitmap) : 65 ms/frame. Unacceptable.
- OpenGL rendering in ortho projection on textured quad. In this case I did not need to scale frame. I just needed to prepare texture 1024x512 (in my case it was RGBA8888) containig frame pixels and than load it in GPU (gl.glTexImage2D). Result : 220 ms/frame to render. Unacceptable. I did not expect that glTexImage2D just sucked on Snapdragon CPU.
That’s all.
I know that there is some way to use fragment shader to convert YUV pixels using GPU, but we will have the same glTexImage2D and 200 ms just to texture loading.But this is not the end. ...my only friend the end... :)
It’s not hopeless condition.Trying to use RockPlayer you definitely will wonder how they do that damn frame scaling so fast. I suppose that they have really good experience in ARM achitecture. They most probably use avcodec_decode_video2 and than img_convert (as I did in RP version), but then they use some tricks (depends of ARM version) for scaling.
Maybe they also have some "magic" buld configuration for ffmpeg decreasing decoding time but Android.mk that they published is not THE Android.mk they use. Dunno...So, now it looks like you can not just buld some easy JNI bridge for ffmpeg and than have real media player for Android platform. You can do this only if you have suitable video that you do not need to scale.
Any ideas ? I hope for you ;)
-
-
ffmpeg capture output from child window
3 janvier 2013, par glitchymeusing
xwininfo -all
I'm able to see the stats of any window, along with its child windowsxwininfo: Window id: 0x3c000ba "Electro - The Slag & Prototype Raptor - Crescendo - YouTube - Mozilla Firefox"
Root window id: 0xa8 (the root window) (has no name)
Parent window id: 0xc001b8 (has no name)
2 children:
0x3c00175 (has no name): () 1388x876+0+0 +52+24
5 children:
0x3d210ab (has no name): () 854x510+225+197 +277+221
1 child:
0x3d210ac (has no name): () 854x510+0+0 +277+221
1 child:
0x40404de "plugin-container": ("plugin-container" "Plugin-container") 854x510+0+0 +277+221
2 children:
0x40404e1 (has no name): () 854x510+0+0 +277+221
0x40404df (has no name): () 1x1+-1+-1 +276+220
0x3ddbcf2 (has no name): () 640x390+225+162 +277+186
1 child:
0x3ddbcf3 (has no name): () 640x390+0+0 +277+186
1 child:
0x403d545 "plugin-container": ("plugin-container" "Plugin-container") 640x390+0+0 +277+186
2 children:
0x403d548 (has no name): () 640x390+0+0 +277+186
0x403d546 (has no name): () 1x1+-1+-1 +276+185
0x3dac7f9 (has no name): () 640x390+225+162 +277+186
1 child:
0x3dac7fa (has no name): () 640x390+0+0 +277+186
1 child:
0x4039d8b "plugin-container": ("plugin-container" "Plugin-container") 640x390+0+0 +277+186
2 children:
0x4039d8e (has no name): () 640x390+0+0 +277+186
0x4039d8c (has no name): () 1x1+-1+-1 +276+185
0x3c3f939 (has no name): () 640x390+225+197 +277+221
1 child:
0x3c3f93a (has no name): () 640x390+0+0 +277+221
1 child:
0x4011918 "plugin-container": ("plugin-container" "Plugin-container") 640x390+0+0 +277+221
2 children:
0x401191b (has no name): () 640x390+0+0 +277+221
0x4011919 (has no name): () 1x1+-1+-1 +276+220
0x3c0d1dc (has no name): () 1x1+0+97 +52+121
1 child:
0x3c0d1dd (has no name): () 1x1+0+0 +52+121
1 child:
0x4002c1e "plugin-container": ("plugin-container" "Plugin-container") 1x1+0+0 +52+121
2 children:
0x4002c40 (has no name): () 1x1+0+0 +52+121
0x4002c1f (has no name): () 1x1+-1+-1 +51+120
0x3c000bb (has no name): () 1x1+-1+-1 +51+23
Absolute upper-left X: 52
Absolute upper-left Y: 24
Relative upper-left X: 0
Relative upper-left Y: 0
Width: 1388
Height: 876
Depth: 24
Visual: 0x23
Visual Class: TrueColor
Border width: 0
Class: InputOutput
Colormap: 0x20 (installed)
Bit Gravity State: NorthWestGravity
Window Gravity State: NorthWestGravity
Backing Store State: NotUseful
Save Under State: no
Map State: IsViewable
Override Redirect State: no
Corners: +52+24 -0+24 -0-0 ç0
-geometry 1388x876-0-0
Bit gravity: NorthWestGravity
Window gravity: NorthWestGravity
Backing-store hint: NotUseful
Backing-planes to be preserved: 0xffffffff
Backing pixel: 0
Save-unders: No
Someone wants these events:
KeyPress
KeyRelease
ButtonPress
ButtonRelease
EnterWindow
LeaveWindow
PointerMotion
Exposure
VisibilityChange
StructureNotify
FocusChange
PropertyChange
Do not propagate these events:
Override redirection?: No
Window manager hints:
Client accepts input or input focus: Yes
Initial state is Normal State
Displayed on desktop 0
Window type:
Normal
Window state:
Maximized Vert
Maximized Horz
Process id: 4087 on host jb
Frame extents: 0, 0, 0, 0
Normal window size hints:
Program supplied minimum size: 18 by 97
Program supplied maximum size: 1073741824 by 1073741824
Program supplied window gravity: NorthWestGravity
No zoom window size hints defined
No window shape defined
No border shape definedHowever, if I try capturing from the screen given the size and offset of the child window, then I risk losing data when another window floats ontop of it, I switch to another tab while recording, I resize the child window, or move the child window. Instead, I'd like to use ffmpeg to capture from specifically that child window.
Ideas ? Tips ? Maybe some other hacks to accomplish this ? Thanks :)