static void ffmovie_cleanup(FFMovie *movie) { if(!movie) return; if(movie->audio_st) { packet_queue_abort(&movie->audioq); SDL_CloseAudio(); packet_queue_end(&movie->audioq); avcodec_close(&movie->audio_st->codec); movie->audio_st = NULL; } if(movie->video_st) { avcodec_close(&movie->video_st->codec); movie->video_st = NULL; } if (movie->context) { av_close_input_file(movie->context); movie->context = NULL; } if(movie->dest_mutex) { SDL_DestroyMutex(movie->dest_mutex); movie->dest_mutex = NULL; } if (movie->dest_overlay) { SDL_FreeYUVOverlay(movie->dest_overlay); movie->dest_overlay = NULL; } Global_num_active--; }
bool Player::Init(int videomode, int connection, int camera) { // Initialize the DeckLink API IDeckLinkIterator *deckLinkIterator = CreateDeckLinkIteratorInstance(); HRESULT result; int i = 0; if (!deckLinkIterator) { fprintf(stderr, "This application requires the DeckLink drivers installed.\n"); goto bail; } m_audioSampleDepth = av_get_exact_bits_per_sample(audio_st->codec->codec_id); switch (audio_st->codec->channels) { case 2: case 8: case 16: break; default: fprintf(stderr, "%d channels not supported, please use 2, 8 or 16\n", audio_st->codec->channels); goto bail; } switch (m_audioSampleDepth) { case 16: case 32: break; default: fprintf(stderr, "%dbit audio not supported use 16bit or 32bit\n", m_audioSampleDepth); } do result = deckLinkIterator->Next(&m_deckLink); while (i++ < camera); if (result != S_OK) { fprintf(stderr, "No DeckLink PCI cards found\n"); goto bail; } // Obtain the audio/video output interface (IDeckLinkOutput) if (m_deckLink->QueryInterface(IID_IDeckLinkOutput, (void **)&m_deckLinkOutput) != S_OK) goto bail; result = m_deckLink->QueryInterface(IID_IDeckLinkConfiguration, (void **)&deckLinkConfiguration); if (result != S_OK) { fprintf( stderr, "Could not obtain the IDeckLinkConfiguration interface - result = %08x\n", result); goto bail; } //XXX make it generic switch (connection) { case 1: DECKLINK_SET_VIDEO_CONNECTION(bmdVideoConnectionComposite); DECKLINK_SET_AUDIO_CONNECTION(bmdAudioConnectionAnalog); break; case 2: DECKLINK_SET_VIDEO_CONNECTION(bmdVideoConnectionComponent); DECKLINK_SET_AUDIO_CONNECTION(bmdAudioConnectionAnalog); break; case 3: DECKLINK_SET_VIDEO_CONNECTION(bmdVideoConnectionHDMI); DECKLINK_SET_AUDIO_CONNECTION(bmdAudioConnectionEmbedded); break; case 4: DECKLINK_SET_VIDEO_CONNECTION(bmdVideoConnectionSDI); DECKLINK_SET_AUDIO_CONNECTION(bmdAudioConnectionEmbedded); break; default: // do not change it break; } // Provide this class as a delegate to the audio and video output interfaces m_deckLinkOutput->SetScheduledFrameCompletionCallback(this); m_deckLinkOutput->SetAudioCallback(this); avframe = avcodec_alloc_frame(); packet_queue_init(&audioqueue); packet_queue_init(&videoqueue); packet_queue_init(&dataqueue); pthread_t th; pthread_create(&th, NULL, fill_queues, NULL); usleep(buffer); // You can add the microseconds you need for pre-buffering before start playing // Start playing StartRunning(videomode); pthread_mutex_lock(&sleepMutex); pthread_cond_wait(&sleepCond, &sleepMutex); pthread_mutex_unlock(&sleepMutex); fill_me = 0; fprintf(stderr, "Exiting, cleaning up\n"); packet_queue_end(&audioqueue); packet_queue_end(&videoqueue); bail: if (m_running == true) { StopRunning(); } else { // Release any resources that were partially allocated if (m_deckLinkOutput != NULL) { m_deckLinkOutput->Release(); m_deckLinkOutput = NULL; } // if (m_deckLink != NULL) { m_deckLink->Release(); m_deckLink = NULL; } } if (deckLinkIterator != NULL) deckLinkIterator->Release(); return true; }