コード例 #1
0
ファイル: aud_file.cpp プロジェクト: OmniBlade/xcc
Cvirtual_binary Caud_file::decode()
{
	Cvirtual_binary d;
	int cb_audio = get_cb_sample() * get_c_samples();
	switch (header().compression)
	{
	case 1:
		{		
			byte* w = d.write_start(cb_audio);
			for (int chunk_i = 0; w != d.data_end(); chunk_i++)
			{				
				const t_aud_chunk_header& header = *get_chunk_header(chunk_i);
				aud_decode_ws_chunk(get_chunk_data(chunk_i), reinterpret_cast<char*>(w), header.size_in, header.size_out);
				w += header.size_out;
			}
		}
		break;
	case 0x63:
		{
			aud_decode decode;
			decode.init();
			byte* w = d.write_start(cb_audio);
			for (int chunk_i = 0; w != d.data_end(); chunk_i++)
			{				
				const t_aud_chunk_header* header = get_chunk_header(chunk_i);
				if (!header)
					break;
				decode.decode_chunk(get_chunk_data(chunk_i), reinterpret_cast<short*>(w), header->size_out / get_cb_sample());
				w += header->size_out;
			}
		}
		break;
	}
	return d;
}
コード例 #2
0
ファイル: output_container.hpp プロジェクト: akemp/hpx
        void save_binary_chunk(void const* address, std::size_t count) // override
        {
            if (filter_ || chunks_ == 0 || count < HPX_ZERO_COPY_SERIALIZATION_THRESHOLD) {
                // fall back to serialization_chunk-less archive
                this->output_container::save_binary(address, count);
            }
            else {
                HPX_ASSERT(get_num_chunks() > current_chunk_);
                HPX_ASSERT(
                    get_chunk_type(current_chunk_) == chunk_type_index ||
                    get_chunk_size(current_chunk_) != 0);

                // complement current serialization_chunk by setting its length
                if (get_chunk_type(current_chunk_) == chunk_type_index)
                {
                    HPX_ASSERT(get_chunk_size(current_chunk_) == 0);

                    set_chunk_size(current_chunk_,
                        current_ - get_chunk_data(current_chunk_).index_);
                }

                // add a new serialization_chunk referring to the external buffer
                chunks_->push_back(create_pointer_chunk(address, count));
                ++current_chunk_;
            }
        }
コード例 #3
0
ファイル: input_container.hpp プロジェクト: K-ballo/hpx
        void load_binary_chunk(void* address, std::size_t count) // override
        {
            HPX_ASSERT((std::int64_t)count >= 0);

            if (chunks_ == nullptr ||
                count < HPX_ZERO_COPY_SERIALIZATION_THRESHOLD ||
                filter_)
            {
                // fall back to serialization_chunk-less archive
                this->input_container::load_binary(address, count);
            }
            else {
                HPX_ASSERT(current_chunk_ != std::size_t(-1));
                HPX_ASSERT(get_chunk_type(current_chunk_) == chunk_type_pointer);

                if (get_chunk_size(current_chunk_) != count)
                {
                    HPX_THROW_EXCEPTION(serialization_error
                      , "input_container::load_binary_chunk"
                      , "archive data bstream data chunk size mismatch");
                    return;
                }

                // unfortunately we can't implement a zero copy policy on
                // the receiving end
                // as the memory was already allocated by the serialization code
                std::memcpy(address, get_chunk_data(current_chunk_).pos_, count);
                ++current_chunk_;
            }
        }
コード例 #4
0
ファイル: response.c プロジェクト: yosisa/meinheld
static void
set_first_body_data(client_t *client, char *data, size_t datalen)
{
    write_bucket *bucket = client->bucket;
    if(data){
        if(client->chunked_response){
            char *lendata  = NULL;
            Py_ssize_t len = 0;

            PyObject *chunk_data = get_chunk_data(datalen);
            //TODO CHECK ERROR
            PyBytes_AsStringAndSize(chunk_data, &lendata, &len);
            set_chunked_data(bucket, lendata, len, data, datalen);
            bucket->chunk_data = chunk_data;
        }else{
            set2bucket(bucket, data, datalen);
        }
    }
}
コード例 #5
0
ファイル: output_container.hpp プロジェクト: akemp/hpx
        ~output_container()
        {
            if (filter_) {
                std::size_t written = 0;

                if (cont_.size() < current_)
                    cont_.resize(current_);
                current_ = start_compressing_at_;

                do {
                    bool flushed = filter_->flush(&cont_[current_],
                        cont_.size()-current_, written);

                    current_ += written;
                    if (flushed)
                        break;

                    // resize container
                    cont_.resize(cont_.size()*2);

                } while (true);

                cont_.resize(current_);         // truncate container
            }
            else if (chunks_) {
                HPX_ASSERT(get_num_chunks() > current_chunk_);
                HPX_ASSERT(
                    get_chunk_type(current_chunk_) == chunk_type_index ||
                    get_chunk_size(current_chunk_) != 0);

                // complement current serialization_chunk by setting its length
                if (get_chunk_type(current_chunk_) == chunk_type_index)
                {
                    HPX_ASSERT(get_chunk_size(current_chunk_) == 0);

                    set_chunk_size(current_chunk_,
                        current_ - get_chunk_data(current_chunk_).index_);
                }
            }
        }
コード例 #6
0
ファイル: response.c プロジェクト: yosisa/meinheld
static response_status
process_write(client_t *client)
{
    PyObject *iterator = NULL;
    PyObject *item, *chunk_data = NULL;
    char *buf = NULL, *lendata = NULL;
    Py_ssize_t buflen, len;
    write_bucket *bucket = NULL;
    response_status ret;
    
    DEBUG("process_write start");
    iterator = client->response_iter;
    if(iterator != NULL){
        while((item =  PyIter_Next(iterator))){
            if(PyBytes_Check(item)){
                //TODO CHECK
                PyBytes_AsStringAndSize(item, &buf, &buflen);
                //write
                if(client->chunked_response){
                    bucket = new_write_bucket(client->fd, 4);
                    if(bucket == NULL){
                        /* write_error_log(__FILE__, __LINE__); */
                        call_error_logger();
                        Py_DECREF(item);
                        return STATUS_ERROR;
                    }
                    lendata  = NULL;
                    len = 0;

                    chunk_data = get_chunk_data(buflen);
                    //TODO CHECK ERROR
                    PyBytes_AsStringAndSize(chunk_data, &lendata, &len);
                    set_chunked_data(bucket, lendata, len, buf, buflen);
                    bucket->chunk_data = chunk_data;
                }else{
                    bucket = new_write_bucket(client->fd, 1);
                    if(bucket == NULL){
                        /* write_error_log(__FILE__, __LINE__); */
                        call_error_logger();
                        Py_DECREF(item);
                        return STATUS_ERROR;
                    }
                    set2bucket(bucket, buf, buflen);
                }
                bucket->temp1 = item;
                ret = writev_bucket(bucket);
                if(ret != STATUS_OK){
                    client->bucket = bucket;
                    /* Py_DECREF(item); */
                    return ret;
                }

                free_write_bucket(bucket);
                //mark
                client->write_bytes += buflen;
                //check write_bytes/content_length
                if(client->content_length_set){
                    if(client->content_length <= client->write_bytes){
                        // all done
                        /* Py_DECREF(item); */
                        break;
                    }
                }
                /* Py_DECREF(item); */
            }else{
                PyErr_SetString(PyExc_TypeError, "response item must be a byte string");
                Py_DECREF(item);
                if (PyErr_Occurred()){
                    /* client->bad_request_code = 500; */
                    client->status_code = 500;
                    /* write_error_log(__FILE__, __LINE__); */
                    call_error_logger();
                    return STATUS_ERROR;
                }
            }
        }
        if(PyErr_Occurred()){
            return STATUS_ERROR;
        }
        if(client->chunked_response){
            DEBUG("write last chunk");
            //last packet
            bucket = new_write_bucket(client->fd, 3);
            if(bucket == NULL){
                /* write_error_log(__FILE__, __LINE__); */
                call_error_logger();
                return STATUS_ERROR;
            }
            set_last_chunked_data(bucket);
            writev_bucket(bucket);
            free_write_bucket(bucket);
        }
        return close_response(client);
    }
    return STATUS_OK;
}