AudioSystem::sample_t* JackAudioSystem::output_buffer(int index)
    {
	jack_nframes_t nframes = output_buffer_size(index);

	if(index == 0) {
	    assert(_port[0]);
	    return static_cast<float*>( jack_port_get_buffer(_port[0], nframes) );
	}else if(index == 1) {
	    assert(_port[1]);
	    return static_cast<float*>( jack_port_get_buffer(_port[1], nframes) );
	}
	return 0;
    }
	int VideoEncoderFfmpeg::Encode(int force_key_frame, int *is_key_frame)
	{
		if (bitrate() < 0)
			return 0;
		
		frag_writer()->Clear();
		frame_->pict_type = AV_PICTURE_TYPE_NONE != force_key_frame ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_NONE;
		int enc_size = avcodec_encode_video(context_,
			output_buffer(), output_buffer_size(), frame_);
		if (0 == enc_size)
			return 0;

		if (NULL != is_key_frame)
			*is_key_frame = frame_->key_frame;

		int size = 0;

		Fragmenter *fragmenter = GetFragmenter();
		if (fragsize() > 0 && NULL != fragmenter) {
#ifdef FRAG_FILE_DEBUG
			{
				static int frame_count_enc = 0;
				FILE *fd = NULL;
				char filename[50];
				sprintf_s(filename, "out_enc_%03d.dbg", frame_count_enc);
				_VERIFY(0 == fopen_s(&fd, filename, "wb"));
				fwrite(output_buffer(), enc_size, 1, fd);
				fclose(fd);
				++frame_count_enc;
			}
#endif
			size = fragmenter->Fragment(output_buffer(), enc_size);
		} else {
			size = enc_size;
			_VERIFY(frag_writer()->AppendItem(output_buffer(), enc_size));
		}
		*fragcount() = frag_writer()->frag_count();
		return size;
	}