[MPlayer-cvslog] r26359 - in trunk/libmpdemux: Makefile aac_hdr.c demux_aac.c
albeu
subversion at mplayerhq.hu
Wed Apr 9 02:43:19 CEST 2008
Author: albeu
Date: Wed Apr 9 02:43:19 2008
New Revision: 26359
Log:
Split the aac header parsing out of aac demuxer to allow using libmpmux
without libmpdemux.
Added:
trunk/libmpdemux/aac_hdr.c
- copied, changed from r26348, /trunk/libmpdemux/demux_aac.c
Modified:
trunk/libmpdemux/Makefile
trunk/libmpdemux/demux_aac.c
Modified: trunk/libmpdemux/Makefile
==============================================================================
--- trunk/libmpdemux/Makefile (original)
+++ trunk/libmpdemux/Makefile Wed Apr 9 02:43:19 2008
@@ -3,7 +3,8 @@ include ../config.mak
LIBNAME_COMMON = libmpdemux.a
LIBNAME_MENCODER = libmpmux.a
-SRCS_COMMON = asfheader.c \
+SRCS_COMMON = aac_hdr.c \
+ asfheader.c \
aviheader.c \
aviprint.c \
demuxer.c \
Copied: trunk/libmpdemux/aac_hdr.c (from r26348, /trunk/libmpdemux/demux_aac.c)
==============================================================================
--- /trunk/libmpdemux/demux_aac.c (original)
+++ trunk/libmpdemux/aac_hdr.c Wed Apr 9 02:43:19 2008
@@ -1,25 +1,27 @@
-#include <stdio.h>
+/*
+ * Copyright (C) 2005 Nico Sabbi
+ *
+ * This file is part of MPlayer.
+ *
+ * MPlayer is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * MPlayer 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with MPlayer; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
#include <stdlib.h>
-#include <string.h>
+#include <inttypes.h>
#include "config.h"
-#include "mp_msg.h"
-#include "help_mp.h"
-
-#include "stream/stream.h"
-#include "demuxer.h"
-#include "parse_es.h"
-#include "stheader.h"
-
-#include "ms_hdr.h"
-
-typedef struct {
- uint8_t *buf;
- uint64_t size; /// amount of time of data packets pushed to demuxer->audio (in bytes)
- float time; /// amount of time elapsed based upon samples_per_frame/sample_rate (in milliseconds)
- float last_pts; /// last pts seen
- int bitrate; /// bitrate computed as size/time
-} aac_priv_t;
/// \param srate (out) sample rate
/// \param num (out) number of audio frames in this ADTS frame
@@ -44,225 +46,3 @@ int aac_parse_frame(uint8_t *buf, int *s
return fl;
}
-
-static int demux_aac_init(demuxer_t *demuxer)
-{
- aac_priv_t *priv;
-
- priv = calloc(1, sizeof(aac_priv_t));
- if(!priv)
- return 0;
-
- priv->buf = (uint8_t*) malloc(8);
- if(!priv->buf)
- {
- free(priv);
- return 0;
- }
-
- demuxer->priv = priv;
- return 1;
-}
-
-static void demux_close_aac(demuxer_t *demuxer)
-{
- aac_priv_t *priv = (aac_priv_t *) demuxer->priv;
-
- if(!priv)
- return;
-
- if(priv->buf)
- free(priv->buf);
-
- free(demuxer->priv);
-
- return;
-}
-
-/// returns DEMUXER_TYPE_AAC if it finds 8 ADTS frames in 32768 bytes, 0 otherwise
-static int demux_aac_probe(demuxer_t *demuxer)
-{
- int cnt = 0, c, len, srate, num;
- off_t init, probed;
- aac_priv_t *priv;
-
- if(! demux_aac_init(demuxer))
- {
- mp_msg(MSGT_DEMUX, MSGL_ERR, "COULDN'T INIT aac_demux, exit\n");
- return 0;
- }
-
- priv = (aac_priv_t *) demuxer->priv;
-
- init = probed = stream_tell(demuxer->stream);
- while(probed-init <= 32768 && cnt < 8)
- {
- c = 0;
- while(c != 0xFF)
- {
- c = stream_read_char(demuxer->stream);
- if(c < 0)
- goto fail;
- }
- priv->buf[0] = 0xFF;
- if(stream_read(demuxer->stream, &(priv->buf[1]), 7) < 7)
- goto fail;
-
- len = aac_parse_frame(priv->buf, &srate, &num);
- if(len > 0)
- {
- cnt++;
- stream_skip(demuxer->stream, len - 8);
- }
- probed = stream_tell(demuxer->stream);
- }
-
- stream_seek(demuxer->stream, init);
- if(cnt < 8)
- goto fail;
-
- mp_msg(MSGT_DEMUX, MSGL_V, "demux_aac_probe, INIT: %"PRIu64", PROBED: %"PRIu64", cnt: %d\n", init, probed, cnt);
- return DEMUXER_TYPE_AAC;
-
-fail:
- mp_msg(MSGT_DEMUX, MSGL_V, "demux_aac_probe, failed to detect an AAC stream\n");
- return 0;
-}
-
-static demuxer_t* demux_aac_open(demuxer_t *demuxer)
-{
- sh_audio_t *sh;
-
- sh = new_sh_audio(demuxer, 0);
- sh->ds = demuxer->audio;
- sh->format = mmioFOURCC('M', 'P', '4', 'A');
- demuxer->audio->id = 0;
- demuxer->audio->sh = sh;
-
- demuxer->filepos = stream_tell(demuxer->stream);
-
- return demuxer;
-}
-
-static int demux_aac_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
-{
- aac_priv_t *priv = (aac_priv_t *) demuxer->priv;
- demux_packet_t *dp;
- int c1, c2, len, srate, num;
- float tm = 0;
-
- if(demuxer->stream->eof || (demuxer->movi_end && stream_tell(demuxer->stream) >= demuxer->movi_end))
- return 0;
-
- while(! demuxer->stream->eof)
- {
- c1 = c2 = 0;
- while(c1 != 0xFF)
- {
- c1 = stream_read_char(demuxer->stream);
- if(c1 < 0)
- return 0;
- }
- c2 = stream_read_char(demuxer->stream);
- if(c2 < 0)
- return 0;
- if((c2 & 0xF6) != 0xF0)
- continue;
-
- priv->buf[0] = (unsigned char) c1;
- priv->buf[1] = (unsigned char) c2;
- if(stream_read(demuxer->stream, &(priv->buf[2]), 6) < 6)
- return 0;
-
- len = aac_parse_frame(priv->buf, &srate, &num);
- if(len > 0)
- {
- dp = new_demux_packet(len);
- if(! dp)
- {
- mp_msg(MSGT_DEMUX, MSGL_ERR, "fill_buffer, NEW_ADD_PACKET(%d)FAILED\n", len);
- return 0;
- }
-
-
- memcpy(dp->buffer, priv->buf, 8);
- stream_read(demuxer->stream, &(dp->buffer[8]), len-8);
- if(srate)
- tm = (float) (num * 1024.0/srate);
- priv->last_pts += tm;
- dp->pts = priv->last_pts;
- //fprintf(stderr, "\nPTS: %.3f\n", dp->pts);
- ds_add_packet(demuxer->audio, dp);
- priv->size += len;
- priv->time += tm;
-
- priv->bitrate = (int) (priv->size / priv->time);
- demuxer->filepos = stream_tell(demuxer->stream);
-
- return len;
- }
- else
- stream_skip(demuxer->stream, -6);
- }
-
- return 0;
-}
-
-
-//This is an almost verbatim copy of high_res_mp3_seek(), from demux_audio.c
-static void demux_aac_seek(demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags)
-{
- aac_priv_t *priv = (aac_priv_t *) demuxer->priv;
- demux_stream_t *d_audio=demuxer->audio;
- sh_audio_t *sh_audio=d_audio->sh;
- float time;
-
- ds_free_packs(d_audio);
-
- time = (flags & SEEK_ABSOLUTE) ? rel_seek_secs - priv->last_pts : rel_seek_secs;
- if(time < 0)
- {
- stream_seek(demuxer->stream, demuxer->movi_start);
- time = priv->last_pts + time;
- priv->last_pts = 0;
- }
-
- if(time > 0)
- {
- int len, nf, srate, num;
-
- nf = time * sh_audio->samplerate/1024;
-
- while(nf > 0)
- {
- if(stream_read(demuxer->stream,priv->buf, 8) < 8)
- break;
- len = aac_parse_frame(priv->buf, &srate, &num);
- if(len <= 0)
- {
- stream_skip(demuxer->stream, -7);
- continue;
- }
- stream_skip(demuxer->stream, len - 8);
- priv->last_pts += (float) (num*1024.0/srate);
- nf -= num;
- }
- }
-}
-
-
-const demuxer_desc_t demuxer_desc_aac = {
- "AAC demuxer",
- "aac",
- "AAC",
- "Nico Sabbi",
- "Raw AAC files ",
- DEMUXER_TYPE_AAC,
- 0, // unsafe autodetect
- demux_aac_probe,
- demux_aac_fill_buffer,
- demux_aac_open,
- demux_close_aac,
- demux_aac_seek,
- NULL
-};
Modified: trunk/libmpdemux/demux_aac.c
==============================================================================
--- trunk/libmpdemux/demux_aac.c (original)
+++ trunk/libmpdemux/demux_aac.c Wed Apr 9 02:43:19 2008
@@ -25,25 +25,7 @@ typedef struct {
/// \param num (out) number of audio frames in this ADTS frame
/// \return size of the ADTS frame in bytes
/// aac_parse_frames needs a buffer at least 8 bytes long
-int aac_parse_frame(uint8_t *buf, int *srate, int *num)
-{
- int i = 0, sr, fl = 0, id;
- static int srates[] = {96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 0, 0, 0};
-
- if((buf[i] != 0xFF) || ((buf[i+1] & 0xF6) != 0xF0))
- return 0;
-
- id = (buf[i+1] >> 3) & 0x01; //id=1 mpeg2, 0: mpeg4
- sr = (buf[i+2] >> 2) & 0x0F;
- if(sr > 11)
- return 0;
- *srate = srates[sr];
-
- fl = ((buf[i+3] & 0x03) << 11) | (buf[i+4] << 3) | ((buf[i+5] >> 5) & 0x07);
- *num = (buf[i+6] & 0x02) + 1;
-
- return fl;
-}
+int aac_parse_frame(uint8_t *buf, int *srate, int *num);
static int demux_aac_init(demuxer_t *demuxer)
{
More information about the MPlayer-cvslog
mailing list