2014年3月4日 星期二

Install java in Ubuntu

sudo apt-get install openjdk-7-jdk

Don't install java by manual.

Buold live555 to Android


在Ubuntu 13.10 64bit下碰到,
bash: /home/xxx/android-sdk-linux/platform-tools/adb: No such file or directoy

try to install lib32stdc++6
sudo apt-get install lub32stdc++6

go to live555 official site and download source code, my download version is  live.2014.02.26.tar.gz

網址為: http://www.live555.com/liveMedia/public/

Compression it and create a folder "jni" in live.

Copy all files into jni folder.

write an Android.mk in
~home/xxx/live/jni/

my Android.mk
 LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := live555

#LOVAL_ARM_MODE := arm
#LOCAL_PRELINK_MODULE := false

#cpp flags?
LOCAL_CPPFLAGS := \
-DNULL=0 -DSCOKLEN_T=socklen_t -DNO_SSTREAM -DBSD=1 -DNO_SSTREAM -fexceptions -DANDROID -DXLOCALE_NOT_USED

#include header
LOCAL_C_INCLUDES := \
$(LOCAL_PATH) \
$(LOCAL_PATH)/BasicUsageEnvironment/include \
$(LOCAL_PATH)/groupsock/include \
$(LOCAL_PATH)/liveMedia/include \
$(LOCAL_PATH)/UsageEnvironment/include

#build the needed source file
LOCAL_SRC_FILES := \
BasicUsageEnvironment/BasicHashTable.cpp \
BasicUsageEnvironment/BasicTaskScheduler.cpp \
BasicUsageEnvironment/BasicTaskScheduler0.cpp \
BasicUsageEnvironment/BasicUsageEnvironment.cpp \
BasicUsageEnvironment/BasicUsageEnvironment0.cpp \
BasicUsageEnvironment/DelayQueue.cpp \
groupsock/GroupEId.cpp \
groupsock/Groupsock.cpp \
groupsock/GroupsockHelper.cpp \
groupsock/inet.c \
groupsock/IOHandlers.cpp \
groupsock/NetAddress.cpp \
groupsock/NetInterface.cpp \
liveMedia/AC3AudioFileServerMediaSubsession.cpp \
liveMedia/AC3AudioRTPSink.cpp \
liveMedia/AC3AudioRTPSource.cpp \
liveMedia/AC3AudioStreamFramer.cpp \
liveMedia/ADTSAudioFileServerMediaSubsession.cpp \
liveMedia/ADTSAudioFileSource.cpp \
liveMedia/AMRAudioFileServerMediaSubsession.cpp \
liveMedia/AMRAudioFileSink.cpp \
liveMedia/AMRAudioFileSource.cpp \
liveMedia/AMRAudioRTPSink.cpp \
liveMedia/AMRAudioRTPSource.cpp \
liveMedia/AMRAudioSource.cpp \
liveMedia/AudioInputDevice.cpp \
liveMedia/AudioRTPSink.cpp \
liveMedia/AVIFileSink.cpp \
liveMedia/Base64.cpp \
liveMedia/BasicUDPSink.cpp \
liveMedia/BasicUDPSource.cpp \
liveMedia/BitVector.cpp \
liveMedia/ByteStreamFileSource.cpp \
liveMedia/ByteStreamMemoryBufferSource.cpp \
liveMedia/ByteStreamMultiFileSource.cpp \
liveMedia/DarwinInjector.cpp \
liveMedia/DeviceSource.cpp \
liveMedia/DigestAuthentication.cpp \
liveMedia/DVVideoFileServerMediaSubsession.cpp \
liveMedia/DVVideoRTPSink.cpp \
liveMedia/DVVideoRTPSource.cpp \
liveMedia/DVVideoStreamFramer.cpp \
liveMedia/EBMLNumber.cpp \
liveMedia/FileServerMediaSubsession.cpp \
liveMedia/FileSink.cpp \
liveMedia/FramedFileSource.cpp \
liveMedia/FramedFilter.cpp \
liveMedia/FramedSource.cpp \
liveMedia/GSMAudioRTPSink.cpp \
liveMedia/H261VideoRTPSource.cpp \
liveMedia/H263plusVideoFileServerMediaSubsession.cpp \
liveMedia/H263plusVideoRTPSink.cpp \
liveMedia/H263plusVideoRTPSource.cpp \
liveMedia/H263plusVideoStreamFramer.cpp \
liveMedia/H263plusVideoStreamParser.cpp \
liveMedia/H264or5VideoFileSink.cpp \
liveMedia/H264or5VideoRTPSink.cpp \
liveMedia/H264or5VideoStreamDiscreteFramer.cpp \
liveMedia/H264or5VideoStreamFramer.cpp \
liveMedia/H264VideoFileServerMediaSubsession.cpp \
liveMedia/H264VideoFileSink.cpp \
liveMedia/H264VideoRTPSink.cpp \
liveMedia/H264VideoRTPSource.cpp \
liveMedia/H264VideoStreamDiscreteFramer.cpp \
liveMedia/H264VideoStreamFramer.cpp \
liveMedia/H265VideoFileServerMediaSubsession.cpp \
liveMedia/H265VideoFileSink.cpp \
liveMedia/H265VideoRTPSink.cpp \
liveMedia/H265VideoRTPSource.cpp \
liveMedia/H265VideoStreamDiscreteFramer.cpp \
liveMedia/H265VideoStreamFramer.cpp \
liveMedia/InputFile.cpp \
liveMedia/JPEGVideoRTPSink.cpp \
liveMedia/JPEGVideoRTPSource.cpp \
liveMedia/JPEGVideoSource.cpp \
liveMedia/Locale.cpp \
liveMedia/MatroskaDemuxedTrack.cpp \
liveMedia/MatroskaFile.cpp \
liveMedia/MatroskaFileParser.cpp \
liveMedia/MatroskaFileServerDemux.cpp \
liveMedia/MatroskaFileServerMediaSubsession.cpp \
liveMedia/Media.cpp \
liveMedia/MediaSession.cpp \
liveMedia/MediaSink.cpp \
liveMedia/MediaSource.cpp \
liveMedia/MP3ADU.cpp \
liveMedia/MP3ADUdescriptor.cpp \
liveMedia/MP3ADUinterleaving.cpp \
liveMedia/MP3ADURTPSink.cpp \
liveMedia/MP3ADURTPSource.cpp \
liveMedia/MP3ADUTranscoder.cpp \
liveMedia/MP3AudioFileServerMediaSubsession.cpp \
liveMedia/MP3AudioMatroskaFileServerMediaSubsession.cpp \
liveMedia/MP3FileSource.cpp \
liveMedia/MP3Internals.cpp \
liveMedia/MP3InternalsHuffman.cpp \
liveMedia/MP3InternalsHuffmanTable.cpp \
liveMedia/MP3StreamState.cpp \
liveMedia/MP3Transcoder.cpp \
liveMedia/MPEG1or2AudioRTPSink.cpp \
liveMedia/MPEG1or2AudioRTPSource.cpp \
liveMedia/MPEG1or2AudioStreamFramer.cpp \
liveMedia/MPEG1or2Demux.cpp \
liveMedia/MPEG1or2DemuxedElementaryStream.cpp \
liveMedia/MPEG1or2DemuxedServerMediaSubsession.cpp \
liveMedia/MPEG1or2FileServerDemux.cpp \
liveMedia/MPEG1or2VideoFileServerMediaSubsession.cpp \
liveMedia/MPEG1or2VideoRTPSink.cpp \
liveMedia/MPEG1or2VideoRTPSource.cpp \
liveMedia/MPEG1or2VideoStreamDiscreteFramer.cpp \
liveMedia/MPEG1or2VideoStreamFramer.cpp \
liveMedia/MPEG2IndexFromTransportStream.cpp \
liveMedia/MPEG2TransportFileServerMediaSubsession.cpp \
liveMedia/MPEG2TransportStreamFramer.cpp \
liveMedia/MPEG2TransportStreamFromESSource.cpp \
liveMedia/MPEG2TransportStreamFromPESSource.cpp \
liveMedia/MPEG2TransportStreamIndexFile.cpp \
liveMedia/MPEG2TransportStreamMultiplexor.cpp \
liveMedia/MPEG2TransportStreamTrickModeFilter.cpp \
liveMedia/MPEG2TransportUDPServerMediaSubsession.cpp \
liveMedia/MPEG4ESVideoRTPSink.cpp \
liveMedia/MPEG4ESVideoRTPSource.cpp \
liveMedia/MPEG4GenericRTPSink.cpp \
liveMedia/MPEG4GenericRTPSource.cpp \
liveMedia/MPEG4LATMAudioRTPSink.cpp \
liveMedia/MPEG4LATMAudioRTPSource.cpp \
liveMedia/MPEG4VideoFileServerMediaSubsession.cpp \
liveMedia/MPEG4VideoStreamDiscreteFramer.cpp \
liveMedia/MPEG4VideoStreamFramer.cpp \
liveMedia/MPEGVideoStreamFramer.cpp \
liveMedia/MPEGVideoStreamParser.cpp \
liveMedia/MultiFramedRTPSink.cpp \
liveMedia/MultiFramedRTPSource.cpp \
liveMedia/OggDemuxedTrack.cpp \
liveMedia/OggFile.cpp \
liveMedia/OggFileParser.cpp \
liveMedia/OggFileServerDemux.cpp \
liveMedia/OggFileServerMediaSubsession.cpp \
liveMedia/OggFileSink.cpp \
liveMedia/OnDemandServerMediaSubsession.cpp \
liveMedia/ourMD5.cpp \
liveMedia/OutputFile.cpp \
liveMedia/PassiveServerMediaSubsession.cpp \
liveMedia/ProxyServerMediaSession.cpp \
liveMedia/QCELPAudioRTPSource.cpp \
liveMedia/QuickTimeFileSink.cpp \
liveMedia/QuickTimeGenericRTPSource.cpp \
liveMedia/RTCP.cpp \
liveMedia/rtcp_from_spec.c \
liveMedia/RTPInterface.cpp \
liveMedia/RTPSink.cpp \
liveMedia/RTPSource.cpp \
liveMedia/RTSPClient.cpp \
liveMedia/RTSPCommon.cpp \
liveMedia/RTSPRegisterSender.cpp \
liveMedia/RTSPServer.cpp \
liveMedia/RTSPServerSupportingHTTPStreaming.cpp \
liveMedia/ServerMediaSession.cpp \
liveMedia/SimpleRTPSink.cpp \
liveMedia/SimpleRTPSource.cpp \
liveMedia/SIPClient.cpp \
liveMedia/StreamParser.cpp \
liveMedia/StreamReplicator.cpp \
liveMedia/T140TextRTPSink.cpp \
liveMedia/TCPStreamSink.cpp \
liveMedia/TextRTPSink.cpp \
liveMedia/TheoraVideoRTPSink.cpp \
liveMedia/TheoraVideoRTPSource.cpp \
liveMedia/uLawAudioFilter.cpp \
liveMedia/VideoRTPSink.cpp \
liveMedia/VorbisAudioRTPSink.cpp \
liveMedia/VorbisAudioRTPSource.cpp \
liveMedia/VP8VideoRTPSink.cpp \
liveMedia/VP8VideoRTPSource.cpp \
liveMedia/WAVAudioFileServerMediaSubsession.cpp \
liveMedia/WAVAudioFileSource.cpp \
UsageEnvironment/HashTable.cpp \
UsageEnvironment/strDup.cpp \
UsageEnvironment/UsageEnvironment.cpp

include $(BUILD_SHARED_LIBRARY)

Type , ndk-bulid in jni folder
ndk-build

Then you gonna got a file, /live/libs/armeabi/liblive555.so

2014年2月27日 星期四

C - call by value, call by value of pointer, call by reference

Call by value

int swap(int a, int b) 

{
    int tmp = a;
    a = b;
    b = tmp;
    printf("%d, %d", &a, &b); // 2686752, 2686756
    printf("%d, %d", a, b); // 20, 10
}

int main() 
{
    int a, b;
    a = 10;
    b = 20;

    printf("%d, %d", &a, &b); // 2686788, 2686784
    swap(a, b);
    printf("%d, %d", a, b); // 10, 20
}

Note
    Just copy the value into swap function

Call by value of pointer
int swap(int *a, int *b) 

{
    int tmp = *a;
    *a = *b;
    *b = tmp;
    printf("%d, %d", &a, &b); // 2686752, 2686756
    printf("%d, %d", a, b); // 2686788, 2686784
    printf("%d, %d", *a, *b); // 20, 10
}

int main() 
{
    int a, b;
    a = 10;
    b = 20;

    printf("%d, %d", &a, &b); // 2686788, 2686784
    swap(&a, &b);
    printf("%d, %d", a, b); // 20, 10
}

Note:
    Send the address of the value into swap function

Call by refrence
int swap(int &a, int &b) 

{
    int tmp = a;
    a = b;
    b = tmp;
    printf("%d, %d", &a, &b); // 2686788, 2686784
    printf("%d, %d", *a, *b); // 20, 10
}

int main() 
{
    int a, b;
    a = 10;
    b = 20;

    printf("%d, %d", &a, &b); // 2686788, 2686784
    swap(a, b);
    printf("%d, %d", a, b); // 20, 10
}

Note
    alias

Reference
    什麼是傳值call by value、傳址call by address、傳參考call by reference
    [C++] Call by value、Call by pointer、Call by reference

C - Data type

sizeof
    printf("sizeof(char) = %d\n", sizeof(char));        // 1
    printf("sizeof(short) = %d\n", sizeof(short));      // 2
    printf("sizeof(int) = %d\n", sizeof(int));          // 4
    printf("sizeof(long) = %d\n", sizeof(long));        // 4
    printf("sizeof(float) = %d\n", sizeof(float));      // 4
    printf("sizeof(double) = %d\n", sizeof(double));    // 8

    printf("sizeof(char) = %d\n", sizeof(char*));       // 4
    printf("sizeof(short) = %d\n", sizeof(short*));     // 4
    printf("sizeof(int) = %d\n", sizeof(int*));         // 4
    printf("sizeof(long) = %d\n", sizeof(long*));       // 4
    printf("sizeof(float) = %d\n", sizeof(float*));     // 4
    printf("sizeof(double) = %d\n", sizeof(double*));   // 4
Reason:
    char
        -128 ~ 127 -> 8 bits needed = 1 byte
    unsigned char
        0 ~255
    short
        -32768 ~ 32767 -> 16 bits needed = 2 bytes
    unsigned short
        0 ~ 65535
    int 
        -2147483648 ~ 2147483647
    float 
        32 bit (s + exp + fraction = 1 + 8 + 23)

    double
        64 bit (1 + 11 +52)

    pointer
        4 bytes = 1 word

Precision Problem
    1. estimate the precision you want.
    2. use big number.



2014年2月25日 星期二

C# - Console in Windows Form

Open Console in Windows Form

In Microsoft Wndows Form Application, console is closed, but you can open it by following snippet.

public partial class Form1 : Form
{

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]

    static extern bool AllocConsole();

    public Form1(string[] args)
    {
        AllocConsole();

        InitializeComponent();
    }
}


Parameter usage
  In "main"
[STAThread]
static void Main(string[] args)
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1(args)); // send args to Form1.cs
}
In Form1.cs
public partial class Form1 : Form
{
    public Form1(string[] args)
    {
        foreach (string parameter in args)
            System.Console.WriteLine(parameter);
    }
}

Android - NetworkOnMainThreadException


Situation:

private void connect() {

    String device_URL = "http://tw.yahoo.com/";

    HttpURLConnection urlc;

    try {

        urlc = (HttpURLConnection) new URL(device_URL).openConnection();

        urlc.connect();

        Log.e("POST", urlc.getResponseMessage());

    } catch (Exception e) {
        e.printStackTrace();
    }

}


It will cause "NetworkOnMainThreadException" when you try to connect the Internet.


Reason of this situation:

In case of the connection is too long, the screen is gonna block in the main thread.
Solution 1:

Ignore the policy, just add few code in below.
(Not recommend and it's only provide android SDK version 9 or highter)

private void ignoreNetworkPolicy() {

    if (android.os.Build.VERSION.SDK_INT > 9) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

        StrictMode.setThreadPolicy(policy);
    }
}


Solution 2:

Use thread.

public void createConnectThread() {

    Thread thread = new Thread(new Runnable() {

        @Override

	public void run() {
		request();
        }

    });

    thread.start();
}


Note:
If you want to update UI in thread, it will not permit because Android only allow main thread can update UI. The solution of this is "Handler".

private void updateUI() {

    Handler handler = new Handler();

    handler.post(new Runnable() {

        @Override

	public void run() {
		mTextView.setText("123");
	}
    });
}

Reference:
解决android.os.NetworkOnMainThreadException

2014年2月24日 星期一

C# - StreamWriter and StreamReader

0. Show text in Console

System.Console.Write("Showing\n"); 

System.Console.WriteLine("Showing");


1. Create a directory

System.IO.Directory.CreateDirectory("Test");


2. Create a file in "Test" folder.

string fileName = "Test\\data.txt";

if(File.Exists(fileName))

    File.Create(fileName).Close();


3. Write Text into "data.txt"

string fileName = "Test\\data.txt";

StreamWriter sw= new StreamWriter(fileName);



sw.Write("First");

sw.WriteLine("Second");



sw.Close();

4. Read Text from "data.txt"

string fileName = "Test\\data.txt";

StreamReader sr = new StreamReader(fileName);



System.Console.WriteLine("" + sr.Read());