Skip to content
Snippets Groups Projects
Commit 28146a8c authored by Reynaldo H. Verdejo Pinochet's avatar Reynaldo H. Verdejo Pinochet
Browse files

new mtv demuxer

Originally committed as revision 6667 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 05749630
No related branches found
No related tags found
No related merge requests found
...@@ -43,3 +43,4 @@ Sascha Sommer ...@@ -43,3 +43,4 @@ Sascha Sommer
Leon van Stuivenberg Leon van Stuivenberg
Roberto Togni Roberto Togni
Lionel Ulmer Lionel Ulmer
Reynaldo Verdejo
...@@ -207,6 +207,7 @@ Muxers/Demuxers: ...@@ -207,6 +207,7 @@ Muxers/Demuxers:
img2.c Michael Niedermayer img2.c Michael Niedermayer
mov.c Francois Revol, Michael Niedermayer mov.c Francois Revol, Michael Niedermayer
mpegts* Mans Rullgard mpegts* Mans Rullgard
mtv.c Reynaldo H. Verdejo Pinochet
mxf.c Baptiste Coudurier mxf.c Baptiste Coudurier
nsvdec.c Francois Revol nsvdec.c Francois Revol
nut.c Alex Beregszaszi nut.c Alex Beregszaszi
......
...@@ -58,6 +58,7 @@ OBJS-$(CONFIG_MMF_DEMUXER) += mmf.o riff.o ...@@ -58,6 +58,7 @@ OBJS-$(CONFIG_MMF_DEMUXER) += mmf.o riff.o
OBJS-$(CONFIG_MMF_MUXER) += mmf.o riff.o OBJS-$(CONFIG_MMF_MUXER) += mmf.o riff.o
OBJS-$(CONFIG_MOV_DEMUXER) += mov.o riff.o isom.o OBJS-$(CONFIG_MOV_DEMUXER) += mov.o riff.o isom.o
OBJS-$(CONFIG_MOV_MUXER) += movenc.o riff.o isom.o OBJS-$(CONFIG_MOV_MUXER) += movenc.o riff.o isom.o
OBJS-$(CONFIG_MTV_DEMUXER) += mtv.o
OBJS-$(CONFIG_TGP_MUXER) += movenc.o riff.o isom.o OBJS-$(CONFIG_TGP_MUXER) += movenc.o riff.o isom.o
OBJS-$(CONFIG_MP4_MUXER) += movenc.o riff.o isom.o OBJS-$(CONFIG_MP4_MUXER) += movenc.o riff.o isom.o
OBJS-$(CONFIG_PSP_MUXER) += movenc.o riff.o isom.o OBJS-$(CONFIG_PSP_MUXER) += movenc.o riff.o isom.o
......
...@@ -200,6 +200,9 @@ void av_register_all(void) ...@@ -200,6 +200,9 @@ void av_register_all(void)
#ifdef CONFIG_MOV_MUXER #ifdef CONFIG_MOV_MUXER
av_register_output_format(&mov_muxer); av_register_output_format(&mov_muxer);
#endif #endif
#ifdef CONFIG_MTV_DEMUXER
av_register_input_format(&mtv_demuxer);
#endif
#ifdef CONFIG_TGP_MUXER #ifdef CONFIG_TGP_MUXER
av_register_output_format(&tgp_muxer); av_register_output_format(&tgp_muxer);
#endif #endif
......
...@@ -91,6 +91,7 @@ extern AVInputFormat mpegps_demuxer; ...@@ -91,6 +91,7 @@ extern AVInputFormat mpegps_demuxer;
extern AVInputFormat mpegts_demuxer; extern AVInputFormat mpegts_demuxer;
extern AVOutputFormat mpegts_muxer; extern AVOutputFormat mpegts_muxer;
extern AVOutputFormat mpjpeg_muxer; extern AVOutputFormat mpjpeg_muxer;
extern AVInputFormat mtv_demuxer;
extern AVInputFormat mxf_demuxer; extern AVInputFormat mxf_demuxer;
extern AVInputFormat nsv_demuxer; extern AVInputFormat nsv_demuxer;
extern AVInputFormat nut_demuxer; extern AVInputFormat nut_demuxer;
......
/*
* mtv demuxer
* Copyright (c) 2006 Reynaldo H. Verdejo Pinochet
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* @file mtv.c
* MTV demuxer.
*/
#include "avformat.h"
#include "bswap.h"
#define MTV_ASUBCHUNK_DATA_SIZE 500
#define MTV_HEADER_SIZE 512
#define MTV_AUDIO_PADDING_SIZE 12
#define AUDIO_SAMPLING_RATE 44100
#define VIDEO_SID 0
#define AUDIO_SID 1
typedef struct MTVDemuxContext {
unsigned int file_size; ///< filesize, not always right
unsigned int segments; ///< number of 512 byte segments
unsigned int audio_identifier; ///< 'MP3' on all files I have seen
unsigned int audio_br; ///< bitrate of audio chanel (mp3)
unsigned int img_colorfmt; ///< frame colorfmt rgb 565/555
unsigned int img_bpp; ///< frame bits per pixel
unsigned int img_width; //
unsigned int img_height; //
unsigned int img_segment_size; ///< size of image segment
unsigned int video_fps; //
unsigned int audio_subsegments; ///< audio subsegments on one segment
uint8_t audio_packet_count;
} MTVDemuxContext;
static int mtv_probe(AVProbeData *p)
{
if(p->buf_size < 3)
return 0;
/* Magic is 'AMV' */
if(*(p->buf) != 'A' || *(p->buf+1) != 'M' || *(p->buf+2) != 'V')
return 0;
return AVPROBE_SCORE_MAX;
}
static int mtv_read_header(AVFormatContext *s, AVFormatParameters *ap)
{
MTVDemuxContext *mtv = s->priv_data;
ByteIOContext *pb = &s->pb;
AVStream *st;
url_fskip(pb, 3);
mtv->file_size = get_le32(pb);
mtv->segments = get_le32(pb);
url_fskip(pb, 32);
mtv->audio_identifier = get_le24(pb);
mtv->audio_br = get_le16(pb);
mtv->img_colorfmt = get_le24(pb);
mtv->img_bpp = get_byte(pb);
mtv->img_width = get_le16(pb);
mtv->img_height = get_le16(pb);
mtv->img_segment_size = get_le16(pb);
url_fskip(pb, 4);
mtv->audio_subsegments = get_le16(pb);
mtv->video_fps = (mtv->audio_br / 4) / mtv->audio_subsegments;
/* FIXME Add sanity check here */
/* first packet is allways audio*/
mtv->audio_packet_count = 1;
/* all systems go! init decoders */
/* video - raw rgb565 */
st = av_new_stream(s, VIDEO_SID);
if(!st)
return AVERROR_NOMEM;
av_set_pts_info(st, 64, 1, mtv->video_fps);
st->codec->codec_type = CODEC_TYPE_VIDEO;
st->codec->codec_id = CODEC_ID_RAWVIDEO;
st->codec->width = mtv->img_width;
st->codec->height = mtv->img_height;
st->codec->bits_per_sample = mtv->img_bpp;
st->codec->sample_rate = mtv->video_fps;
/* audio - mp3 */
st = av_new_stream(s, AUDIO_SID);
if(!st)
return AVERROR_NOMEM;
av_set_pts_info(st, 64, 1, AUDIO_SAMPLING_RATE);
st->codec->codec_type = CODEC_TYPE_AUDIO;
st->codec->codec_id = CODEC_ID_MP3;
st->codec->bit_rate = mtv->audio_br;
st->need_parsing=1;
/* Jump over header */
if(url_fseek(pb, MTV_HEADER_SIZE, SEEK_SET) != MTV_HEADER_SIZE)
return AVERROR_IO;
return(0);
}
static int mtv_read_packet(AVFormatContext *s, AVPacket *pkt)
{
MTVDemuxContext *mtv = s->priv_data;
ByteIOContext *pb = &s->pb;
int ret;
#ifndef WORDS_BIGENDIAN
int i;
#endif
ret = 0;
if(mtv->audio_subsegments >= mtv->audio_packet_count)
{
url_fskip(pb, MTV_AUDIO_PADDING_SIZE);
ret = av_get_packet(pb, pkt, MTV_ASUBCHUNK_DATA_SIZE);
if(ret != MTV_ASUBCHUNK_DATA_SIZE)
return AVERROR_IO;
mtv->audio_packet_count++;
pkt->stream_index = AUDIO_SID;
}else
{
ret = av_get_packet(pb, pkt, mtv->img_segment_size);
if(ret != mtv->img_segment_size)
return AVERROR_IO;
#ifndef WORDS_BIGENDIAN
/* pkt->data is GGGRRRR BBBBBGGG
* and we need RRRRRGGG GGGBBBBB
* for PIX_FMT_RGB565 so here we
* just swap bytes as they come
*/
for(i=0;i<mtv->img_segment_size/2;i++)
*((uint16_t *)pkt->data+i) = bswap_16(*((uint16_t *)pkt->data+i));
#endif
mtv->audio_packet_count = 1;
pkt->stream_index = VIDEO_SID;
}
return(ret);
}
AVInputFormat mtv_demuxer = {
"MTV",
"MTV format",
sizeof(MTVDemuxContext),
mtv_probe,
mtv_read_header,
mtv_read_packet,
};
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment