⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 decoders.c

📁 wince下著名的视频播放器源码
💻 C
📖 第 1 页 / 共 5 页
字号:
/* test_libFLAC - Unit tester for libFLAC * Copyright (C) 2002,2003,2004,2005  Josh Coalson * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. */#include "decoders.h"#include "file_utils.h"#include "metadata_utils.h"#include "FLAC/assert.h"#include "FLAC/file_decoder.h"#include "FLAC/seekable_stream_decoder.h"#include "FLAC/stream_decoder.h"#include "share/grabbag.h"#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct {	FILE *file;	unsigned current_metadata_number;	FLAC__bool ignore_errors;	FLAC__bool error_occurred;} stream_decoder_client_data_struct;typedef stream_decoder_client_data_struct seekable_stream_decoder_client_data_struct;typedef stream_decoder_client_data_struct file_decoder_client_data_struct;static FLAC__StreamMetadata streaminfo_, padding_, seektable_, application1_, application2_, vorbiscomment_, cuesheet_, unknown_;static FLAC__StreamMetadata *expected_metadata_sequence_[8];static unsigned num_expected_;static const char *flacfilename_ = "metadata.flac";static unsigned flacfilesize_;static FLAC__bool die_(const char *msg){	printf("ERROR: %s\n", msg);	return false;}static FLAC__bool die_s_(const char *msg, const FLAC__StreamDecoder *decoder){	FLAC__StreamDecoderState state = FLAC__stream_decoder_get_state(decoder);	if(msg)		printf("FAILED, %s", msg);	else		printf("FAILED");	printf(", state = %u (%s)\n", (unsigned)state, FLAC__StreamDecoderStateString[state]);	return false;}static FLAC__bool die_ss_(const char *msg, const FLAC__SeekableStreamDecoder *decoder){	FLAC__SeekableStreamDecoderState state = FLAC__seekable_stream_decoder_get_state(decoder);	if(msg)		printf("FAILED, %s", msg);	else		printf("FAILED");	printf(", state = %u (%s)\n", (unsigned)state, FLAC__SeekableStreamDecoderStateString[state]);	if(state == FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR) {		FLAC__StreamDecoderState state_ = FLAC__seekable_stream_decoder_get_stream_decoder_state(decoder);		printf("      stream decoder state = %u (%s)\n", (unsigned)state_, FLAC__StreamDecoderStateString[state_]);	}	return false;}static FLAC__bool die_f_(const char *msg, const FLAC__FileDecoder *decoder){	FLAC__FileDecoderState state = FLAC__file_decoder_get_state(decoder);	if(msg)		printf("FAILED, %s", msg);	else		printf("FAILED");	printf(", state = %u (%s)\n", (unsigned)state, FLAC__FileDecoderStateString[state]);	if(state == FLAC__FILE_DECODER_SEEKABLE_STREAM_DECODER_ERROR) {		FLAC__SeekableStreamDecoderState state_ = FLAC__file_decoder_get_seekable_stream_decoder_state(decoder);		printf("      seekable stream decoder state = %u (%s)\n", (unsigned)state, FLAC__SeekableStreamDecoderStateString[state_]);		if(state_ == FLAC__SEEKABLE_STREAM_DECODER_STREAM_DECODER_ERROR) {			FLAC__StreamDecoderState state__ = FLAC__file_decoder_get_stream_decoder_state(decoder);			printf("      stream decoder state = %u (%s)\n", (unsigned)state__, FLAC__StreamDecoderStateString[state__]);		}	}	return false;}static void init_metadata_blocks_(){	mutils__init_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_);}static void free_metadata_blocks_(){	mutils__free_metadata_blocks(&streaminfo_, &padding_, &seektable_, &application1_, &application2_, &vorbiscomment_, &cuesheet_, &unknown_);}static FLAC__bool generate_file_(){	printf("\n\ngenerating FLAC file for decoder tests...\n");	num_expected_ = 0;	expected_metadata_sequence_[num_expected_++] = &padding_;	expected_metadata_sequence_[num_expected_++] = &seektable_;	expected_metadata_sequence_[num_expected_++] = &application1_;	expected_metadata_sequence_[num_expected_++] = &application2_;	expected_metadata_sequence_[num_expected_++] = &vorbiscomment_;	expected_metadata_sequence_[num_expected_++] = &cuesheet_;	expected_metadata_sequence_[num_expected_++] = &unknown_;	if(!file_utils__generate_flacfile(flacfilename_, &flacfilesize_, 512 * 1024, &streaminfo_, expected_metadata_sequence_, num_expected_))		return die_("creating the encoded file");	return true;}static FLAC__StreamDecoderReadStatus stream_decoder_read_callback_(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], unsigned *bytes, void *client_data){	stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;	const unsigned requested_bytes = *bytes;	(void)decoder;	if(0 == dcd) {		printf("ERROR: client_data in read callback is NULL\n");		return FLAC__STREAM_DECODER_READ_STATUS_ABORT;	}	if(dcd->error_occurred)		return FLAC__STREAM_DECODER_READ_STATUS_ABORT;	if(feof(dcd->file)) {		*bytes = 0;		return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;	}	else if(requested_bytes > 0) {		*bytes = fread(buffer, 1, requested_bytes, dcd->file);		if(*bytes == 0) {			if(feof(dcd->file))				return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM;			else				return FLAC__STREAM_DECODER_READ_STATUS_ABORT;		}		else {			return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE;		}	}	else		return FLAC__STREAM_DECODER_READ_STATUS_ABORT; /* abort to avoid a deadlock */}static FLAC__StreamDecoderWriteStatus stream_decoder_write_callback_(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, const FLAC__int32 * const buffer[], void *client_data){	stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;	(void)decoder, (void)buffer;	if(0 == dcd) {		printf("ERROR: client_data in write callback is NULL\n");		return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;	}	if(dcd->error_occurred)		return FLAC__STREAM_DECODER_WRITE_STATUS_ABORT;	if(		(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_FRAME_NUMBER && frame->header.number.frame_number == 0) ||		(frame->header.number_type == FLAC__FRAME_NUMBER_TYPE_SAMPLE_NUMBER && frame->header.number.sample_number == 0)	) {		printf("content... ");		fflush(stdout);	}	return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE;}static void stream_decoder_metadata_callback_(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data){	stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;	(void)decoder;	if(0 == dcd) {		printf("ERROR: client_data in metadata callback is NULL\n");		return;	}	if(dcd->error_occurred)		return;	printf("%d... ", dcd->current_metadata_number);	fflush(stdout);	if(dcd->current_metadata_number >= num_expected_) {		(void)die_("got more metadata blocks than expected");		dcd->error_occurred = true;	}	else {		if(!mutils__compare_block(expected_metadata_sequence_[dcd->current_metadata_number], metadata)) {			(void)die_("metadata block mismatch");			dcd->error_occurred = true;		}	}	dcd->current_metadata_number++;}static void stream_decoder_error_callback_(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data){	stream_decoder_client_data_struct *dcd = (stream_decoder_client_data_struct*)client_data;	(void)decoder;	if(0 == dcd) {		printf("ERROR: client_data in error callback is NULL\n");		return;	}	if(!dcd->ignore_errors) {		printf("ERROR: got error callback: err = %u (%s)\n", (unsigned)status, FLAC__StreamDecoderErrorStatusString[status]);		dcd->error_occurred = true;	}}static FLAC__bool stream_decoder_test_respond_(FLAC__StreamDecoder *decoder, stream_decoder_client_data_struct *dcd){	if(!FLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_))		return die_s_("at FLAC__stream_decoder_set_read_callback(), returned false", decoder);	if(!FLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_))		return die_s_("at FLAC__stream_decoder_set_write_callback(), returned false", decoder);	if(!FLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_))		return die_s_("at FLAC__stream_decoder_set_metadata_callback(), returned false", decoder);	if(!FLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_))		return die_s_("at FLAC__stream_decoder_set_error_callback(), returned false", decoder);	if(!FLAC__stream_decoder_set_client_data(decoder, dcd))		return die_s_("at FLAC__stream_decoder_set_client_data(), returned false", decoder);	printf("testing FLAC__stream_decoder_init()... ");	if(FLAC__stream_decoder_init(decoder) != FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)		return die_s_(0, decoder);	printf("OK\n");	dcd->current_metadata_number = 0;	if(fseek(dcd->file, 0, SEEK_SET) < 0) {		printf("FAILED rewinding input, errno = %d\n", errno);		return false;	}	printf("testing FLAC__stream_decoder_process_until_end_of_stream()... ");	if(!FLAC__stream_decoder_process_until_end_of_stream(decoder))		return die_s_("returned false", decoder);	printf("OK\n");	printf("testing FLAC__stream_decoder_finish()... ");	FLAC__stream_decoder_finish(decoder);	printf("OK\n");	return true;}static FLAC__bool test_stream_decoder(){	FLAC__StreamDecoder *decoder;	FLAC__StreamDecoderState state;	stream_decoder_client_data_struct decoder_client_data;	printf("\n+++ libFLAC unit test: FLAC__StreamDecoder\n\n");	printf("testing FLAC__stream_decoder_new()... ");	decoder = FLAC__stream_decoder_new();	if(0 == decoder) {		printf("FAILED, returned NULL\n");		return false;	}	printf("OK\n");	printf("testing FLAC__stream_decoder_delete()... ");	FLAC__stream_decoder_delete(decoder);	printf("OK\n");	printf("testing FLAC__stream_decoder_new()... ");	decoder = FLAC__stream_decoder_new();	if(0 == decoder) {		printf("FAILED, returned NULL\n");		return false;	}	printf("OK\n");	printf("testing FLAC__stream_decoder_init()... ");	if(FLAC__stream_decoder_init(decoder) == FLAC__STREAM_DECODER_SEARCH_FOR_METADATA)		return die_s_(0, decoder);	printf("OK\n");	printf("testing FLAC__stream_decoder_delete()... ");	FLAC__stream_decoder_delete(decoder);	printf("OK\n");	num_expected_ = 0;	expected_metadata_sequence_[num_expected_++] = &streaminfo_;	printf("testing FLAC__stream_decoder_new()... ");	decoder = FLAC__stream_decoder_new();	if(0 == decoder) {		printf("FAILED, returned NULL\n");		return false;	}	printf("OK\n");	printf("testing FLAC__stream_decoder_set_read_callback()... ");	if(!FLAC__stream_decoder_set_read_callback(decoder, stream_decoder_read_callback_))		return die_s_("returned false", decoder);	printf("OK\n");	printf("testing FLAC__stream_decoder_set_write_callback()... ");	if(!FLAC__stream_decoder_set_write_callback(decoder, stream_decoder_write_callback_))		return die_s_("returned false", decoder);	printf("OK\n");	printf("testing FLAC__stream_decoder_set_metadata_callback()... ");	if(!FLAC__stream_decoder_set_metadata_callback(decoder, stream_decoder_metadata_callback_))		return die_s_("returned false", decoder);	printf("OK\n");	printf("testing FLAC__stream_decoder_set_error_callback()... ");	if(!FLAC__stream_decoder_set_error_callback(decoder, stream_decoder_error_callback_))		return die_s_("returned false", decoder);	printf("OK\n");	printf("testing FLAC__stream_decoder_set_client_data()... ");	if(!FLAC__stream_decoder_set_client_data(decoder, &decoder_client_data))		return die_s_("returned false", decoder);	printf("OK\n");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -