mmdevicefw/mdf/src/audio/Vorbis/PU/encoder/vorbisencoderprocessingunit.cpp
author hgs
Fri, 08 Oct 2010 19:40:43 +0100
changeset 0 79dd3e2336a0
permissions -rw-r--r--
2010wk36_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     1
// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     2
// All rights reserved.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     3
// This component and the accompanying materials are made available
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     4
// under the terms of "Eclipse Public License v1.0"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     5
// which accompanies this distribution, and is available
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     7
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     8
// Initial Contributors:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
     9
// Nokia Corporation - initial contribution.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    10
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    11
// Contributors:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    12
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    13
// Description:
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    14
//
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    15
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    16
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    17
 @file
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    18
 @internalComponent
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    19
*/
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    20
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    21
#include <mdf/mdfpuconfig.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    22
#include <mmf/server/taskconfig.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    23
#include <omxprocessingunit.h>
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    24
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    25
#include "vorbisencoderprocessingunit.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    26
#include "vorbisencoderinputport.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    27
#include "vorbisencoderoutputport.h"
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    28
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    29
const TInt KVorbisEncoderInputPortIndex = 0;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    30
const TInt KVorbisEncoderOutputPortIndex = 1;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    31
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    32
_LIT8(KVorbisEncoderILComponentName,"OMX.SYMBIAN.AUDIO.ENCODER.VORBIS");
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    33
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    34
// for the derivation of these constants see
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    35
// http://en.wikipedia.org/wiki/Vorbis
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    36
const TInt KVorbisQualityMinus1 = 4500;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    37
const TInt KVorbisQuality0 = 6000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    38
const TInt KVorbisQuality1 = 80000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    39
const TInt KVorbisQuality2 = 96000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    40
const TInt KVorbisQuality3 = 110000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    41
const TInt KVorbisQuality4 = 128000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    42
const TInt KVorbisQuality5 = 160000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    43
const TInt KVorbisQuality6 = 192000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    44
const TInt KVorbisQuality7 = 224000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    45
const TInt KVorbisQuality8 = 256000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    46
const TInt KVorbisQuality9 = 320000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    47
const TInt KVorbisQuality10 = 500000;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    48
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    49
CVorbisEncoderProcessingUnit::CVorbisEncoderProcessingUnit()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    50
  : iVorbisEncoderInputPort(NULL),
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    51
    iVorbisEncoderOutputPort(NULL)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    52
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    53
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    54
	// input defaults (EPCM16)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    55
	iInputBitsPerSample = 16;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    56
	iNumInputType = OMX_NumericalDataSigned;		
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    57
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    58
	// no output defaults (EVorbis)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    59
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    60
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    61
CVorbisEncoderProcessingUnit* CVorbisEncoderProcessingUnit::NewL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    62
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    63
	CVorbisEncoderProcessingUnit* self = new (ELeave) CVorbisEncoderProcessingUnit;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    64
	CleanupStack::PushL(self);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    65
	self->ConstructL();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    66
	CleanupStack::Pop(self);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    67
	return self;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    68
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    69
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    70
void CVorbisEncoderProcessingUnit::ConstructL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    71
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    72
	// setup supported bit rates array
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    73
	iSupportedBitRates.Reset();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    74
	iSupportedBitRates.AppendL(KVorbisQualityMinus1);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    75
	iSupportedBitRates.AppendL(KVorbisQuality0);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    76
	iSupportedBitRates.AppendL(KVorbisQuality1);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    77
	iSupportedBitRates.AppendL(KVorbisQuality2);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    78
	iSupportedBitRates.AppendL(KVorbisQuality3);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    79
	iSupportedBitRates.AppendL(KVorbisQuality4);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    80
	iSupportedBitRates.AppendL(KVorbisQuality5);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    81
	iSupportedBitRates.AppendL(KVorbisQuality6);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    82
	iSupportedBitRates.AppendL(KVorbisQuality7);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    83
	iSupportedBitRates.AppendL(KVorbisQuality8);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    84
	iSupportedBitRates.AppendL(KVorbisQuality9);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    85
	iSupportedBitRates.AppendL(KVorbisQuality10);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    86
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    87
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    88
CVorbisEncoderProcessingUnit::~CVorbisEncoderProcessingUnit()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    89
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    90
	iSupportedBitRates.Reset();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    91
	iSupportedBitRates.Close();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    92
	delete iVorbisEncoderOutputPort;			
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    93
	delete iVorbisEncoderInputPort;	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    94
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    95
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    96
TInt CVorbisEncoderProcessingUnit::Create(const MMdfProcessingUnitObserver& aProcessingUnitObserver)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    97
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    98
	TRAPD(err, CreateL(aProcessingUnitObserver));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
    99
	return err;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   100
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   101
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   102
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   103
void CVorbisEncoderProcessingUnit::CreateL(const MMdfProcessingUnitObserver& aProcessingUnitObserver)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   104
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   105
	COmxProcessingUnit::ConstructL(KVorbisEncoderILComponentName, aProcessingUnitObserver);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   106
	iVorbisEncoderInputPort  = CVorbisEncoderInputPort::NewL(KVorbisEncoderInputPortIndex, this);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   107
	iVorbisEncoderOutputPort = CVorbisEncoderOutputPort::NewL(KVorbisEncoderOutputPortIndex, this);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   108
	User::LeaveIfError(AddInputPort(iVorbisEncoderInputPort));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   109
	User::LeaveIfError(AddOutputPort(iVorbisEncoderOutputPort));
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   110
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   111
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   112
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   113
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   114
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   115
TInt CVorbisEncoderProcessingUnit::CreateCustomInterface(TUid aInterfaceId)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   116
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   117
	if (aInterfaceId == KUidCustomInterfaceDevSoundBitRate)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   118
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   119
		// There is no work to create this interface, so just return no error
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   120
		return KErrNone;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   121
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   122
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   123
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   124
		return KErrNotSupported;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   125
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   126
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   127
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   128
TAny* CVorbisEncoderProcessingUnit::CustomInterface(TUid aInterfaceId)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   129
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   130
	// The vorbis encoder requires the custom interface for bitrates
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   131
	if (aInterfaceId == KUidCustomInterfaceDevSoundBitRate)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   132
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   133
		return static_cast<MMMFDevSoundCustomInterfaceBitRate*> (this);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   134
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   135
	else
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   136
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   137
		return NULL;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   138
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   139
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   140
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   141
/**
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   142
Gets the bit rates that are supported by DevSound in its current configuration.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   143
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   144
@param  aSupportedBitRates
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   145
The supported bit rates, in bits per second, shall be appended to this array. Note that 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   146
the array shall be reset by this method.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   147
*/
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   148
void CVorbisEncoderProcessingUnit::GetSupportedBitRatesL(RArray<TInt>& aSupportedBitRates)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   149
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   150
	aSupportedBitRates.Reset();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   151
	TInt c = iSupportedBitRates.Count();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   152
	for(TInt i = 0; i < c; i++) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   153
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   154
		aSupportedBitRates.AppendL(iSupportedBitRates[i]);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   155
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   156
 	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   157
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   158
TInt CVorbisEncoderProcessingUnit::BitRateL()
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   159
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   160
	return iVorbisEncoderOutputPort->BitRate();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   161
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   162
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   163
void CVorbisEncoderProcessingUnit::SetBitRateL(TInt aBitRate)
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   164
	{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   165
	// We can't strictly set the bit rate outside of calling
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   166
	// MopConfigure() on the output port.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   167
	// However if we own the port we can call its SetBitRateL() method
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   168
	// which is not part of MMdfOutputPort.
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   169
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   170
	// set the bitrate to the nearest available, rounding down
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   171
	TInt c = iSupportedBitRates.Count();
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   172
	for(TInt i = c-1; i >= 0; i--) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   173
		{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   174
		if(aBitRate >= iSupportedBitRates[i]) 
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   175
			{
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   176
			iVorbisEncoderOutputPort->SetBitRate(iSupportedBitRates[i]);
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   177
			return;
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   178
			}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   179
		}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   180
	User::Leave(KErrNotSupported);	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   181
	}
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   182
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   183
// end
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   184
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   185
	
79dd3e2336a0 2010wk36_01
hgs
parents:
diff changeset
   186