Пример #1
0
    // before read
    void* message_parser::read_buffer_ptr(int read_next)
    {
        if (read_next + _read_buffer_occupied >  _read_buffer.length())
        {
            // remember currently read content
            auto rb = _read_buffer.range(0, _read_buffer_occupied);
            
            // switch to next
            if (read_next + _read_buffer_occupied > _buffer_block_size)
                create_new_buffer(read_next + _read_buffer_occupied);
            else
                create_new_buffer(_buffer_block_size);

            // copy
            if (rb.length() > 0)
            {
                memcpy((void*)_read_buffer.data(), (const void*)rb.data(), rb.length());
                _read_buffer_occupied = rb.length();
            }            
            
            dassert (read_next + _read_buffer_occupied <= _read_buffer.length(), "");
        }

        return (void*)(_read_buffer.data() + _read_buffer_occupied);
    }
Пример #2
0
kivi_client* create_new_client(int fd) {
	kivi_client* client = malloc(sizeof(kivi_client));
	client -> fd = fd;
	client -> in_buf = create_new_buffer(INITIAL_BUFFER_SIZE);
	client -> out_buf = create_new_buffer(INITIAL_BUFFER_SIZE);
	return client;
}
Пример #3
0
 message_parser::message_parser(int buffer_block_size, bool is_write_only)
     : _buffer_block_size(buffer_block_size)
 {
     if (!is_write_only)
     {
         create_new_buffer(buffer_block_size);
     }
 }
Пример #4
0
    void binary_writer::create_buffer(size_t size)
    {
        commit();

        blob bb;
        create_new_buffer(size, bb);
        _buffers.push_back(bb);

        _current_buffer = (char*)bb.data();        
        _current_buffer_length = bb.length();
    }
Пример #5
0
void* get_space(size_t needed_space)
{
    int i=0;
    void *res;
    while(i<(res_buf->nbuffers))
    {
        GEOM_BUF mb = res_buf->buffers[i];
        if((mb.buffer_end-mb.used_space_end)>=needed_space)
        {
            res = (void*) mb.used_space_end;
            res_buf->buffers[i].used_space_end+=needed_space;
            return res;
        }
        i++;
    }

    /*Ok, we didn't have space enough anywhere, let's allocate some*/

    res = create_new_buffer(needed_space);

    return res;//create_new_buffer(res_buf, needed_space);
}
Пример #6
0
static int mpeg4_unpack_bframes_filter(AVBSFContext *ctx, AVPacket *out)
{
    UnpackBFramesBSFContext *s = ctx->priv_data;
    int pos_p = -1, nb_vop = 0, pos_vop2 = -1, ret = 0;
    AVPacket *in;

    ret = ff_bsf_get_packet(ctx, &in);
    if (ret < 0)
        return ret;

    scan_buffer(in->data, in->size, &pos_p, &nb_vop, &pos_vop2);
    av_log(ctx, AV_LOG_DEBUG, "Found %d VOP startcode(s) in this packet.\n", nb_vop);

    if (pos_vop2 >= 0) {
        if (s->b_frame_buf) {
            av_log(ctx, AV_LOG_WARNING,
                   "Missing one N-VOP packet, discarding one B-frame.\n");
            av_freep(&s->b_frame_buf);
            s->b_frame_buf_size = 0;
        }
        /* store the packed B-frame in the BSFContext */
        s->b_frame_buf_size = in->size - pos_vop2;
        s->b_frame_buf      = create_new_buffer(in->data + pos_vop2, s->b_frame_buf_size);
        if (!s->b_frame_buf) {
            s->b_frame_buf_size = 0;
            av_packet_free(&in);
            return AVERROR(ENOMEM);
        }
    }

    if (nb_vop > 2) {
        av_log(ctx, AV_LOG_WARNING,
       "Found %d VOP headers in one packet, only unpacking one.\n", nb_vop);
    }

    if (nb_vop == 1 && s->b_frame_buf) {
        /* use frame from BSFContext */
        ret = av_packet_copy_props(out, in);
        if (ret < 0) {
            av_packet_free(&in);
            return ret;
        }

        ret = av_packet_from_data(out, s->b_frame_buf, s->b_frame_buf_size);
        if (ret < 0) {
            av_packet_free(&in);
            return ret;
        }
        if (in->size <= MAX_NVOP_SIZE) {
            /* N-VOP */
            av_log(ctx, AV_LOG_DEBUG, "Skipping N-VOP.\n");
            s->b_frame_buf      = NULL;
            s->b_frame_buf_size = 0;
        } else {
            /* copy packet into BSFContext */
            s->b_frame_buf_size = in->size;
            s->b_frame_buf      = create_new_buffer(in->data, in->size);
            if (!s->b_frame_buf) {
                s->b_frame_buf_size = 0;
                av_packet_unref(out);
                av_packet_free(&in);
                return AVERROR(ENOMEM);
            }
        }
    } else if (nb_vop >= 2) {
        /* use first frame of the packet */
        av_packet_move_ref(out, in);
        out->size = pos_vop2;
    } else if (pos_p >= 0) {
        av_log(ctx, AV_LOG_DEBUG, "Updating DivX userdata (remove trailing 'p').\n");
        av_packet_move_ref(out, in);
        /* remove 'p' (packed) from the end of the (DivX) userdata string */
        out->data[pos_p] = '\0';
    } else {
        /* copy packet */
        av_packet_move_ref(out, in);
    }

    av_packet_free(&in);

    return 0;
}
Пример #7
0
 message_parser::message_parser(int buffer_block_size)
     : _buffer_block_size(buffer_block_size)
 {
     create_new_buffer(buffer_block_size);
 }
Пример #8
0
static int mpeg4_unpack_bframes_filter(AVBitStreamFilterContext *bsfc,
                                       AVCodecContext *avctx, const char *args,
                                       uint8_t  **poutbuf, int *poutbuf_size,
                                       const uint8_t *buf, int      buf_size,
                                       int keyframe)
{
    UnpackBFramesBSFContext *ctx = bsfc->priv_data;
    int pos_p = -1, nb_vop = 0, pos_vop2 = -1, ret = 0;

    if (avctx->codec_id != AV_CODEC_ID_MPEG4) {
        av_log(avctx, AV_LOG_ERROR,
               "The mpeg4_unpack_bframes bitstream filter is only useful for mpeg4.\n");
        return AVERROR(EINVAL);
    }

    if (!ctx->updated_extradata && avctx->extradata) {
        int pos_p_ext = -1;
        scan_buffer(avctx->extradata, avctx->extradata_size, &pos_p_ext, NULL, NULL);
        if (pos_p_ext >= 0) {
            av_log(avctx, AV_LOG_DEBUG,
                   "Updating DivX userdata (remove trailing 'p') in extradata.\n");
            avctx->extradata[pos_p_ext] = '\0';
        }
        ctx->updated_extradata = 1;
    }

    scan_buffer(buf, buf_size, &pos_p, &nb_vop, &pos_vop2);
    av_log(avctx, AV_LOG_DEBUG, "Found %d VOP startcode(s) in this packet.\n", nb_vop);

    if (pos_vop2 >= 0) {
        if (ctx->b_frame_buf) {
            av_log(avctx, AV_LOG_WARNING,
                   "Missing one N-VOP packet, discarding one B-frame.\n");
            av_freep(&ctx->b_frame_buf);
            ctx->b_frame_buf_size = 0;
        }
        /* store the packed B-frame in the BSFContext */
        ctx->b_frame_buf_size = buf_size - pos_vop2;
        ctx->b_frame_buf      = create_new_buffer(buf + pos_vop2, ctx->b_frame_buf_size);
        if (!ctx->b_frame_buf) {
            ctx->b_frame_buf_size = 0;
            return AVERROR(ENOMEM);
        }
    }

    if (nb_vop > 2) {
        av_log(avctx, AV_LOG_WARNING,
       "Found %d VOP headers in one packet, only unpacking one.\n", nb_vop);
    }

    if (nb_vop == 1 && ctx->b_frame_buf) {
        /* use frame from BSFContext */
        *poutbuf      = ctx->b_frame_buf;
        *poutbuf_size = ctx->b_frame_buf_size;
        /* the output buffer is distinct from the input buffer */
        ret = 1;
        if (buf_size <= MAX_NVOP_SIZE) {
            /* N-VOP */
            av_log(avctx, AV_LOG_DEBUG, "Skipping N-VOP.\n");
            ctx->b_frame_buf      = NULL;
            ctx->b_frame_buf_size = 0;
        } else {
            /* copy packet into BSFContext */
            ctx->b_frame_buf_size = buf_size;
            ctx->b_frame_buf      = create_new_buffer(buf , buf_size);
            if (!ctx->b_frame_buf) {
                ctx->b_frame_buf_size = 0;
                av_freep(poutbuf);
                *poutbuf_size = 0;
                return AVERROR(ENOMEM);
            }
        }
    } else if (nb_vop >= 2) {
        /* use first frame of the packet */
        *poutbuf      = (uint8_t *) buf;
        *poutbuf_size = pos_vop2;
    } else if (pos_p >= 0) {
        av_log(avctx, AV_LOG_DEBUG, "Updating DivX userdata (remove trailing 'p').\n");
        *poutbuf_size = buf_size;
        *poutbuf      = create_new_buffer(buf, buf_size);
        if (!*poutbuf) {
            *poutbuf_size = 0;
            return AVERROR(ENOMEM);
        }
        /* remove 'p' (packed) from the end of the (DivX) userdata string */
        (*poutbuf)[pos_p] = '\0';
        /* the output buffer is distinct from the input buffer */
        ret = 1;
    } else {
        /* copy packet */
        *poutbuf      = (uint8_t *) buf;
        *poutbuf_size = buf_size;
    }

    return ret;
}