示例#1
0
static int iff_read_packet(AVFormatContext *s,
                           AVPacket *pkt)
{
    IffDemuxContext *iff = s->priv_data;
    ByteIOContext *pb = s->pb;
    int ret;

    if(iff->sent_bytes > iff->body_size)
        return AVERROR(EIO);

    if(s->streams[0]->codec->channels == 2) {
        uint8_t sample_buffer[PACKET_SIZE];

        ret = get_buffer(pb, sample_buffer, PACKET_SIZE);
        if(av_new_packet(pkt, PACKET_SIZE) < 0) {
            av_log(s, AV_LOG_ERROR, "iff: cannot allocate packet \n");
            return AVERROR(ENOMEM);
        }
        interleave_stereo(sample_buffer, pkt->data, PACKET_SIZE);
    }
    else {
        ret = av_get_packet(pb, pkt, PACKET_SIZE);
    }

    if(iff->sent_bytes == 0)
        pkt->flags |= PKT_FLAG_KEY;

    iff->sent_bytes += PACKET_SIZE;
    pkt->stream_index = 0;
    pkt->pts = iff->audio_frame_count;
    iff->audio_frame_count += ret / s->streams[0]->codec->channels;
    return ret;
}
示例#2
0
static int iff_read_packet(AVFormatContext *s,
                           AVPacket *pkt)
{
    IffDemuxContext *iff = s->priv_data;
    ByteIOContext *pb = s->pb;
    AVStream *st = s->streams[0];
    int ret;

    if(iff->sent_bytes >= iff->body_size)
        return AVERROR(EIO);

    if(s->streams[0]->codec->channels == 2) {
        uint8_t sample_buffer[PACKET_SIZE];

        ret = get_buffer(pb, sample_buffer, PACKET_SIZE);
        if(av_new_packet(pkt, PACKET_SIZE) < 0) {
            av_log(s, AV_LOG_ERROR, "iff: cannot allocate packet \n");
            return AVERROR(ENOMEM);
        }
        interleave_stereo(sample_buffer, pkt->data, PACKET_SIZE);
    } else if (s->streams[0]->codec->codec_id == CODEC_ID_RAWVIDEO) {
        if(av_new_packet(pkt, iff->body_size + AVPALETTE_SIZE) < 0) {
            return AVERROR(ENOMEM);
        }

        ret = ff_cmap_read_palette(st->codec, (uint32_t*)(pkt->data + iff->body_size));
        if (ret < 0)
            return ret;
        av_freep(&st->codec->extradata);
        st->codec->extradata_size = 0;

        ret = get_buffer(pb, pkt->data, iff->body_size);
    } else if (s->streams[0]->codec->codec_type == CODEC_TYPE_VIDEO) {
        ret = av_get_packet(pb, pkt, iff->body_size);
    } else {
        ret = av_get_packet(pb, pkt, PACKET_SIZE);
    }

    if(iff->sent_bytes == 0)
        pkt->flags |= PKT_FLAG_KEY;

    if(s->streams[0]->codec->codec_type == CODEC_TYPE_AUDIO) {
        iff->sent_bytes += PACKET_SIZE;
    } else {
        iff->sent_bytes = iff->body_size;
    }
    pkt->stream_index = 0;
    if(s->streams[0]->codec->codec_type == CODEC_TYPE_AUDIO) {
        pkt->pts = iff->audio_frame_count;
        iff->audio_frame_count += ret / s->streams[0]->codec->channels;
    }
    return ret;
}
示例#3
0
static int iff_read_packet(AVFormatContext *s,
                           AVPacket *pkt)
{
    IffDemuxContext *iff = s->priv_data;
    AVIOContext *pb = s->pb;
    AVStream *st = s->streams[0];
    int ret;

    if(iff->sent_bytes >= iff->body_size)
        return AVERROR(EIO);

    if(st->codec->channels == 2)
    {
        uint8_t sample_buffer[PACKET_SIZE];

        ret = avio_read(pb, sample_buffer, PACKET_SIZE);
        if(av_new_packet(pkt, PACKET_SIZE) < 0)
        {
            av_log(s, AV_LOG_ERROR, "cannot allocate packet\n");
            return AVERROR(ENOMEM);
        }
        interleave_stereo(sample_buffer, pkt->data, PACKET_SIZE);
    }
    else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
    {
        ret = av_get_packet(pb, pkt, iff->body_size);
    }
    else
    {
        ret = av_get_packet(pb, pkt, PACKET_SIZE);
    }

    if(iff->sent_bytes == 0)
        pkt->flags |= AV_PKT_FLAG_KEY;

    if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
    {
        iff->sent_bytes += PACKET_SIZE;
    }
    else
    {
        iff->sent_bytes = iff->body_size;
    }
    pkt->stream_index = 0;
    if(st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
    {
        pkt->pts = iff->audio_frame_count;
        iff->audio_frame_count += ret / st->codec->channels;
    }
    return ret;
}