* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include <inttypes.h>
+
#include "libavutil/intreadwrite.h"
#include "avformat.h"
#include "internal.h"
#define DXA_EXTRA_SIZE 9
-typedef struct{
+typedef struct DXAContext {
int frames;
int has_sound;
int bpc;
ast = avformat_new_stream(s, NULL);
if (!ast)
return -1;
- ret = ff_get_wav_header(pb, ast->codec, fsize);
+ ret = ff_get_wav_header(s, pb, ast->codecpar, fsize);
if (ret < 0)
return ret;
+ if (ast->codecpar->sample_rate > 0)
+ avpriv_set_pts_info(ast, 64, 1, ast->codecpar->sample_rate);
// find 'data' chunk
while(avio_tell(pb) < c->vidpos && !pb->eof_reached){
tag = avio_rl32(pb);
avio_skip(pb, fsize);
}
c->bpc = (fsize + c->frames - 1) / c->frames;
- if(ast->codec->block_align)
- c->bpc = ((c->bpc + ast->codec->block_align - 1) / ast->codec->block_align) * ast->codec->block_align;
+ if(ast->codecpar->block_align)
+ c->bpc = ((c->bpc + ast->codecpar->block_align - 1) / ast->codecpar->block_align) * ast->codecpar->block_align;
c->bytes_left = fsize;
c->wavpos = avio_tell(pb);
avio_seek(pb, c->vidpos, SEEK_SET);
}
/* now we are ready: build format streams */
- st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
- st->codec->codec_id = CODEC_ID_DXA;
- st->codec->width = w;
- st->codec->height = h;
+ st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
+ st->codecpar->codec_id = AV_CODEC_ID_DXA;
+ st->codecpar->width = w;
+ st->codecpar->height = h;
av_reduce(&den, &num, den, num, (1UL<<31)-1);
avpriv_set_pts_info(st, 33, num, den);
/* flags & 0x80 means that image is interlaced,
* either way set true height
*/
if(flags & 0xC0){
- st->codec->height >>= 1;
+ st->codecpar->height >>= 1;
}
c->readvid = !c->has_sound;
c->vidpos = avio_tell(pb);
avio_read(s->pb, buf + 4, DXA_EXTRA_SIZE - 4);
size = AV_RB32(buf + 5);
if(size > 0xFFFFFF){
- av_log(s, AV_LOG_ERROR, "Frame size is too big: %d\n", size);
+ av_log(s, AV_LOG_ERROR, "Frame size is too big: %"PRIu32"\n",
+ size);
return -1;
}
if(av_new_packet(pkt, size + DXA_EXTRA_SIZE + pal_size) < 0)
memcpy(pkt->data + pal_size, buf, DXA_EXTRA_SIZE);
ret = avio_read(s->pb, pkt->data + DXA_EXTRA_SIZE + pal_size, size);
if(ret != size){
- av_free_packet(pkt);
+ av_packet_unref(pkt);
return AVERROR(EIO);
}
if(pal_size) memcpy(pkt->data, pal, pal_size);