avformat: add derf demuxer
This commit is contained in:
		
							parent
							
								
									c6bbdba9cd
								
							
						
					
					
						commit
						4f248a34c5
					
				@ -51,6 +51,7 @@ version <next>:
 | 
				
			|||||||
- ADPCM IMA MTF decoder
 | 
					- ADPCM IMA MTF decoder
 | 
				
			||||||
- FWSE demuxer
 | 
					- FWSE demuxer
 | 
				
			||||||
- DERF DPCM decoder
 | 
					- DERF DPCM decoder
 | 
				
			||||||
 | 
					- DERF demuxer
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
version 4.2:
 | 
					version 4.2:
 | 
				
			||||||
 | 
				
			|||||||
@ -151,6 +151,7 @@ OBJS-$(CONFIG_DASH_DEMUXER)              += dash.o dashdec.o
 | 
				
			|||||||
OBJS-$(CONFIG_DAUD_DEMUXER)              += dauddec.o
 | 
					OBJS-$(CONFIG_DAUD_DEMUXER)              += dauddec.o
 | 
				
			||||||
OBJS-$(CONFIG_DAUD_MUXER)                += daudenc.o
 | 
					OBJS-$(CONFIG_DAUD_MUXER)                += daudenc.o
 | 
				
			||||||
OBJS-$(CONFIG_DCSTR_DEMUXER)             += dcstr.o
 | 
					OBJS-$(CONFIG_DCSTR_DEMUXER)             += dcstr.o
 | 
				
			||||||
 | 
					OBJS-$(CONFIG_DERF_DEMUXER)              += derf.o pcm.o
 | 
				
			||||||
OBJS-$(CONFIG_DFA_DEMUXER)               += dfa.o
 | 
					OBJS-$(CONFIG_DFA_DEMUXER)               += dfa.o
 | 
				
			||||||
OBJS-$(CONFIG_DHAV_DEMUXER)              += dhav.o
 | 
					OBJS-$(CONFIG_DHAV_DEMUXER)              += dhav.o
 | 
				
			||||||
OBJS-$(CONFIG_DIRAC_DEMUXER)             += diracdec.o rawdec.o
 | 
					OBJS-$(CONFIG_DIRAC_DEMUXER)             += diracdec.o rawdec.o
 | 
				
			||||||
 | 
				
			|||||||
@ -113,6 +113,7 @@ extern AVOutputFormat ff_data_muxer;
 | 
				
			|||||||
extern AVInputFormat  ff_daud_demuxer;
 | 
					extern AVInputFormat  ff_daud_demuxer;
 | 
				
			||||||
extern AVOutputFormat ff_daud_muxer;
 | 
					extern AVOutputFormat ff_daud_muxer;
 | 
				
			||||||
extern AVInputFormat  ff_dcstr_demuxer;
 | 
					extern AVInputFormat  ff_dcstr_demuxer;
 | 
				
			||||||
 | 
					extern AVInputFormat  ff_derf_demuxer;
 | 
				
			||||||
extern AVInputFormat  ff_dfa_demuxer;
 | 
					extern AVInputFormat  ff_dfa_demuxer;
 | 
				
			||||||
extern AVInputFormat  ff_dhav_demuxer;
 | 
					extern AVInputFormat  ff_dhav_demuxer;
 | 
				
			||||||
extern AVInputFormat  ff_dirac_demuxer;
 | 
					extern AVInputFormat  ff_dirac_demuxer;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										79
									
								
								libavformat/derf.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								libavformat/derf.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,79 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * DERF demuxer
 | 
				
			||||||
 | 
					 * Copyright (c) 2020 Paul B Mahol
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 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
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "libavutil/intreadwrite.h"
 | 
				
			||||||
 | 
					#include "avformat.h"
 | 
				
			||||||
 | 
					#include "internal.h"
 | 
				
			||||||
 | 
					#include "pcm.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int derf_probe(const AVProbeData *p)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (AV_RL32(p->buf) != MKTAG('D','E','R','F'))
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					    if (AV_RL32(p->buf+4) != 1 && AV_RL32(p->buf+4) != 2)
 | 
				
			||||||
 | 
					        return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return AVPROBE_SCORE_MAX / 3 * 2;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int derf_read_header(AVFormatContext *s)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned data_size;
 | 
				
			||||||
 | 
					    AVIOContext *pb = s->pb;
 | 
				
			||||||
 | 
					    AVCodecParameters *par;
 | 
				
			||||||
 | 
					    AVStream *st;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    avio_skip(pb, 4);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    st = avformat_new_stream(s, NULL);
 | 
				
			||||||
 | 
					    if (!st)
 | 
				
			||||||
 | 
					        return AVERROR(ENOMEM);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    par              = st->codecpar;
 | 
				
			||||||
 | 
					    par->codec_type  = AVMEDIA_TYPE_AUDIO;
 | 
				
			||||||
 | 
					    par->codec_id    = AV_CODEC_ID_DERF_DPCM;
 | 
				
			||||||
 | 
					    par->format      = AV_SAMPLE_FMT_S16;
 | 
				
			||||||
 | 
					    par->channels    = avio_rl32(pb);
 | 
				
			||||||
 | 
					    if (par->channels != 1 && par->channels != 2)
 | 
				
			||||||
 | 
					        return AVERROR_INVALIDDATA;
 | 
				
			||||||
 | 
					    if (par->channels == 1)
 | 
				
			||||||
 | 
					        par->channel_layout = AV_CH_LAYOUT_MONO;
 | 
				
			||||||
 | 
					    else if (par->channels == 2)
 | 
				
			||||||
 | 
					        par->channel_layout = AV_CH_LAYOUT_STEREO;
 | 
				
			||||||
 | 
					    data_size = avio_rl32(pb);
 | 
				
			||||||
 | 
					    st->duration = data_size / par->channels;
 | 
				
			||||||
 | 
					    par->sample_rate = 22050;
 | 
				
			||||||
 | 
					    par->block_align = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    avpriv_set_pts_info(st, 64, 1, par->sample_rate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					AVInputFormat ff_derf_demuxer = {
 | 
				
			||||||
 | 
					    .name           = "derf",
 | 
				
			||||||
 | 
					    .long_name      = NULL_IF_CONFIG_SMALL("Xilam DERF"),
 | 
				
			||||||
 | 
					    .read_probe     = derf_probe,
 | 
				
			||||||
 | 
					    .read_header    = derf_read_header,
 | 
				
			||||||
 | 
					    .read_packet    = ff_pcm_read_packet,
 | 
				
			||||||
 | 
					    .read_seek      = ff_pcm_read_seek,
 | 
				
			||||||
 | 
					    .extensions     = "adp",
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user