mirror of
https://github.com/game-stop/veejay.git
synced 2025-12-16 12:50:00 +01:00
fix error handling and cleanup in v4l2 stream driver
This commit is contained in:
@@ -599,8 +599,8 @@ static int v4l2_setup_avcodec_capture( v4l2info *v, int wid, int hei, int codec_
|
|||||||
free(v->picture->data[1]);
|
free(v->picture->data[1]);
|
||||||
free(v->picture->data[2]);
|
free(v->picture->data[2]);
|
||||||
free(v->picture);
|
free(v->picture);
|
||||||
avhelper_free_context( &v->c );
|
//avhelper_free_context( &v->c );
|
||||||
//av_free(v->c);
|
av_free(v->c);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1385,21 +1385,20 @@ void v4l2_close( void *d )
|
|||||||
v->picture = NULL;
|
v->picture = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(v->codec) {
|
if(v->c) {
|
||||||
#if LIBAVCODEC_BUILD > 5400
|
av_free( v->c );
|
||||||
avcodec_close(v->c);
|
v->c = NULL;
|
||||||
#else
|
|
||||||
avcodec_close(v->codec);
|
|
||||||
avhelper_free_context( &v->c );
|
|
||||||
//if(v->c) free(v->c);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( v->host_frame )
|
if( v->host_frame ) {
|
||||||
free(v->host_frame );
|
free(v->host_frame );
|
||||||
|
v->host_frame = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if( v->buffers )
|
if( v->buffers ) {
|
||||||
free(v->buffers);
|
free(v->buffers);
|
||||||
|
v->host_frame = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
free(v);
|
free(v);
|
||||||
}
|
}
|
||||||
@@ -1990,6 +1989,7 @@ static void *v4l2_grabber_thread( void *v )
|
|||||||
uint8_t *ptr = (uint8_t*) vj_malloc( sizeof(uint8_t) * RUP8(planes[0] * 4) );
|
uint8_t *ptr = (uint8_t*) vj_malloc( sizeof(uint8_t) * RUP8(planes[0] * 4) );
|
||||||
if(!ptr) {
|
if(!ptr) {
|
||||||
i->stop = 1;
|
i->stop = 1;
|
||||||
|
v4l2_close( v4l2 );
|
||||||
veejay_msg(0, "v4l2: error allocating memory" );
|
veejay_msg(0, "v4l2: error allocating memory" );
|
||||||
unlock_(v);
|
unlock_(v);
|
||||||
pthread_exit(NULL);
|
pthread_exit(NULL);
|
||||||
@@ -2007,8 +2007,7 @@ static void *v4l2_grabber_thread( void *v )
|
|||||||
for( c = 0; c < 4; c ++ )
|
for( c = 0; c < 4; c ++ )
|
||||||
v4l2->out_planes[c] = planes[c];
|
v4l2->out_planes[c] = planes[c];
|
||||||
|
|
||||||
veejay_msg(VEEJAY_MSG_INFO, "v4l2: capture format: %d x %d (%x)",
|
veejay_msg(VEEJAY_MSG_INFO, "v4l2: capture format: %d x %d (%x)",v4l2->info->width,v4l2->info->height, v4l2->info->format );
|
||||||
v4l2->info->width,v4l2->info->height, v4l2->info->format );
|
|
||||||
|
|
||||||
i->grabbing = 1;
|
i->grabbing = 1;
|
||||||
i->retries = max_retries;
|
i->retries = max_retries;
|
||||||
@@ -2049,10 +2048,8 @@ static void *v4l2_grabber_thread( void *v )
|
|||||||
if( err == -1 ) {
|
if( err == -1 ) {
|
||||||
if( i->retries < 0 ) {
|
if( i->retries < 0 ) {
|
||||||
veejay_msg(0,"v4l2: giving up on this device, too many errors.");
|
veejay_msg(0,"v4l2: giving up on this device, too many errors.");
|
||||||
i->stop = 1;
|
goto v4l2_grabber_exit;
|
||||||
v4l2_close( v4l2 );
|
|
||||||
pthread_exit(NULL);
|
|
||||||
return NULL;
|
|
||||||
} else {
|
} else {
|
||||||
i->retries --;
|
i->retries --;
|
||||||
}
|
}
|
||||||
@@ -2060,11 +2057,18 @@ static void *v4l2_grabber_thread( void *v )
|
|||||||
|
|
||||||
if( i->stop ) {
|
if( i->stop ) {
|
||||||
veejay_msg(VEEJAY_MSG_DEBUG, "v4l2: Closing video capture device");
|
veejay_msg(VEEJAY_MSG_DEBUG, "v4l2: Closing video capture device");
|
||||||
v4l2_close(v4l2);
|
goto v4l2_grabber_exit;
|
||||||
pthread_exit(NULL);
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v4l2_grabber_exit:
|
||||||
|
|
||||||
|
veejay_msg(VEEJAY_MSG_DEBUG, "v4l2: Cleanup grabber thread" );
|
||||||
|
v4l2_close( v4l2 );
|
||||||
|
|
||||||
|
i->stop = 1;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int v4l2_thread_start( v4l2_thread_info *i )
|
int v4l2_thread_start( v4l2_thread_info *i )
|
||||||
@@ -2194,10 +2198,13 @@ void *v4l2_thread_new( char *file, int channel, int host_fmt, int wid, int hei,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( i->stop ) {
|
if( i->stop ) {
|
||||||
veejay_msg(VEEJAY_MSG_ERROR, "v4l2: Grabber thread was told to exit.");
|
veejay_msg(VEEJAY_MSG_INFO, "v4l2: Grabber thread was told to exit.");
|
||||||
pthread_mutex_destroy(&(i->mutex));
|
pthread_mutex_destroy(&(i->mutex));
|
||||||
pthread_cond_destroy(&(i->cond));
|
pthread_cond_destroy(&(i->cond));
|
||||||
|
free(i);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return i->v4l2;
|
return i->v4l2;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user