[FFMPEG] avformat_open_input function gives error

3,620 views
Skip to first unread message

Hitesh singla

unread,
Oct 7, 2015, 3:01:44 AM10/7/15
to Native-Client-Discuss
Hi,
 
I ported the FFMPEG library to PNaCl. While call to  "avformat_open_input" function with HLS url, it gives error-- "unable to open file"
 
 
                        const char    *url =http://cdn-fms.rbs.com.br/vod/hls_sample1_manifest.m3u8;
                        avformat_open_input(&pFormatCtx, url, NULL, NULL)
 
 
 
So i tried to mount http link:
 

mount("

 

http://cdn-fms.rbs.com.br", /* source. Use relative URL */

"/http", /* target */

"httpfs", /* filesystemtype */

0, /* mountflags */

""); /* data */

avformat_open_input(&s1,"/http/vod/hls_sample1_manifest.m3u8", NULL, NULL);

But no success even after mounting http link with error message: error number "-13",  Permission Denied
 
 
I am able to successfully call avformat_open_input for local mp4 file but unable to do so with http link?
 
 
Any help will be appreciated..
 
 
Regards,
Hitesh singla

Sam Clegg

unread,
Oct 7, 2015, 2:30:14 PM10/7/15
to native-cli...@googlegroups.com
On Wed, Oct 7, 2015 at 12:01 AM, Hitesh singla
<hiteshs...@gmail.com> wrote:
> Hi,
>
> I ported the FFMPEG library to PNaCl. While call to "avformat_open_input"
> function with HLS url, it gives error-- "unable to open file"
>
>
> const char *url
> =http://cdn-fms.rbs.com.br/vod/hls_sample1_manifest.m3u8;
> avformat_open_input(&pFormatCtx, url, NULL, NULL)

For this method to work you would need to make sure that ffmeg is
compiled with network/http support (the build off ffmpeg in naclports
is currently built with this disabled, but it should be possible to
enable it). You will then also need to be running in a chrome app
with the required socket permissions, since ffmpeg will be fetching
its data directly via TCP.

>
>
>
> So i tried to mount http link:
>
>
> mount("
>
>
>
> http://cdn-fms.rbs.com.br", /* source. Use relative URL */
>
> "/http", /* target */
>
> "httpfs", /* filesystemtype */
>
> 0, /* mountflags */
>
> ""); /* data */
>
> avformat_open_input(&s1,"/http/vod/hls_sample1_manifest.m3u8", NULL, NULL);
>
> But no success even after mounting http link with error message: error
> number "-13", Permission Denied
>
>
> I am able to successfully call avformat_open_input for local mp4 file but
> unable to do so with http link?

You are most likely running into CORS issues here. The first thing
would try would be to add "allow_cross_origin_requests:true
allow_credentials:false" as the final argument to the mount() call.

Do you see any activity in chrome's developer tools when you make the request?

cheers,
sam

>
>
> Any help will be appreciated..
>
>
> Regards,
> Hitesh singla
>
> --
> You received this message because you are subscribed to the Google Groups
> "Native-Client-Discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to native-client-di...@googlegroups.com.
> To post to this group, send email to native-cli...@googlegroups.com.
> Visit this group at http://groups.google.com/group/native-client-discuss.
> For more options, visit https://groups.google.com/d/optout.

ankit hora

unread,
Oct 9, 2015, 7:15:17 AM10/9/15
to Native-Client-Discuss
Hi Sam,

Very Kind of you to reply.

I am posting the query on behalf of Hitesh.

 
1 We have recompiled the naclport ffmpeg without  --disable-network flag in the files ( naclports/src/ports/ffmpeg/build.sh and naclports/src/ports/libav/build.sh )
2 Made changes in the manifest.json to include the permissions for socket TCP GET
3 Also added the flags  --allow-nacl-socket-api=localhost while running the crome.exe 
4 added "allow_cross_origin_requests:true allow_credentials:false" in mount command.

Also can  you please tell how to verify  "see any activity in chrome's developer tools when you make the request?" is Developer Tool console you are referring ?

Please find the excepts of files below:

##################
I have used nacl_io_demo.c as a base and modified the two functions void* HandleMessageThread and Instance_DidCreate


File :manifest.json
{
    "name": "NaCl IO Demo",
    "version": "44.0.2403.157",
    "manifest_version": 2,
    "description": "NaCl IO Demo Example",
    "offline_enabled": true,
    "icons": {
        "128": "icon128.png"
    },
    "app": {
        "background": {
            "scripts": [
                "background.js"
            ]
        }
    },
    "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCMN716Qyu0l2EHNFqIJVqVysFcTR6urqhaGGqW4UK7slBaURz9+Sb1b4Ot5P1uQNE5c+CTU5Vu61wpqmSqMMxqHLWdPPMh8uRlyctsb2cxWwG6XoGSvpX29NsQVUFXd4v2tkJm3G9t+V0X8TYskrvWQmnyOW8OEIDvrBhUEfFxWQIDAQAB",
    "oauth2": {
        "client_id": "903965034255.apps.googleusercontent.com",
        "scopes": [
        ]
    },
    "sockets": {
        "udp": {
            "send": "*"
        },
        "tcp": {
            "connect": "*"
        },
        "tcpServer": {
            "listen": "*"
        }
    },

  "permissions": [
    "storage",
        "http://*/",
    "unlimitedStorage",
    {
      "socket": [
        "tcp-listen:*:*",
        "tcp-connect:*:*",
        "resolve-host",
        "udp-bind:*:*",
        "udp-send-to:*:*"
      ]
    }
  ]
}

########
FILE: nacl_io_demo.c

void* HandleMessageThread(void* user_data) 
{

PostMessage( "Trying to call avformat_open_input\n");

AVFormatContext *s1 = NULL;
av_register_all();
avformat_network_init();

 
int  ret = avformat_open_input(&s1,"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8", NULL, NULL);
int  ret1 = avformat_open_input(&s1,"/http/iphone/samples/bipbop/bipbopall.m3u8", NULL, NULL);
if(ret<0)
{
char errbuf[50];
av_strerror(ret, errbuf, sizeof(errbuf));
PostMessage( "Could not open source file http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8\n");
PostMessage("\nerro code=%d and cause  returned is %s\n",ret,errbuf); 
}

else
{
PostMessage( "Success in opening  source file");
}


 if(ret1<0)
        {
                char errbuf[50];
                av_strerror(ret1, errbuf, sizeof(errbuf));
                PostMessage( "Could not open source file /http/iphone/samples/bipbop/bipbopall.m3u8 \n");
                PostMessage("\nerro code=%d and cause  returned is %s\n",ret1,errbuf);
        }

        else
        {
                 PostMessage( "Success in opening  source file");
        }



while (1) 
{
struct PP_Var message = DequeueMessage();
HandleMessage(message);
g_ppb_var->Release(message);
}

}

static PP_Bool Instance_DidCreate(PP_Instance instance,
                                  uint32_t argc,
                                  const char* argn[],
                                  const char* argv[]) 
{
g_instance = instance;
nacl_io_init_ppapi(instance, g_get_browser_interface);

umount("/");
mount("", "/", "memfs", 0, "");

int ret= mount("http://devimages.apple.com",
"/http",  /* target */
"httpfs", /* filesystemtype */
0,        /* mountflags */
"allow_cross_origin_requests:true allow_credentials:false");      /* data */

if (ret) 
{
PostMessage("mounting http filesystem failed\n");
}

pthread_create(&g_handle_message_thread, NULL, &HandleMessageThread, NULL);
pthread_create(&g_echo_thread, NULL, &EchoThread, NULL);
InitializeMessageQueue();

return PP_TRUE;
}
###########

Could not open source file http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8  erro code=-5 and cause  returned is I/O error

Could not open source file /http/iphone/samples/bipbop/bipbopall.m3u8                                    erro code=-13 and cause  returned is Permission denied


Any help and guidance is heartily appreciated.


Ben Smith

unread,
Oct 13, 2015, 2:09:36 PM10/13/15
to Native-Client-Discuss
Comments inline:

On Friday, October 9, 2015 at 4:15:17 AM UTC-7, ankit hora wrote:
Hi Sam,

Very Kind of you to reply.

I am posting the query on behalf of Hitesh.

 
1 We have recompiled the naclport ffmpeg without  --disable-network flag in the files ( naclports/src/ports/ffmpeg/build.sh and naclports/src/ports/libav/build.sh )
2 Made changes in the manifest.json to include the permissions for socket TCP GET
3 Also added the flags  --allow-nacl-socket-api=localhost while running the crome.exe 
4 added "allow_cross_origin_requests:true allow_credentials:false" in mount command.

Also can  you please tell how to verify  "see any activity in chrome's developer tools when you make the request?" is Developer Tool console you are referring ?


Yes, this will be easiest to debug by using the Chrome Developer console, as Sam mentioned. Take a look at the network tab. It will display all network requests made by the NaCl module. You may need to open the console, then reload the page to see the request. If you are having CORS issues you should be able to tell from the HTTP response in the network view.

Using the URL directly as a path won't work, unfortunately. Using the /http mount should work, however.
 
<snip>

comput...@gmail.com

unread,
Oct 14, 2015, 7:01:36 AM10/14/15
to Native-Client-Discuss
hi,singla,
i am new nacl developer ,i want to decode h264 in nacl with ffmpeg,but do not know how to ported FFMPEG library to PNaCl.i compiled ffmpeg static lib (under MinGW),such as libavcode.a ,libformat.a...,but when call av_register_all(),it return error"undefinded refer to av_register_all".could you tell me the way you  ported FFMPEG library to PNaCl?
thanks.

在 2015年10月7日星期三 UTC+8下午3:01:44,Hitesh singla写道:

Ben Smith

unread,
Oct 14, 2015, 3:06:59 PM10/14/15
to Native-Client-Discuss
You're probably not linking the libraries into your executable. Please respond with the commandline arguments you are using for your linker.

comput...@gmail.com

unread,
Oct 14, 2015, 11:22:13 PM10/14/15
to Native-Client-Discuss
hi,
i used makefile of one example,LIBS = pthread ppapi_cpp ppapi pthread avformat avdevice avcodec avutil pthread,and i am sure it found the lib (such as libavformat.a).

Ben Smith

unread,
Oct 15, 2015, 6:21:20 PM10/15/15
to Native-Client-Discuss
There isn't enough information here to know why your link is failing, but typically it fails for one of these reasons:
1) you aren't including the library on your link line. Run make with V=1 to log the commands executed for the build and look for -lavformat, etc. If you built and installed the libraries via naclports, they will be installed directly into the toolchain directory, so you won't need to modify your library search directories.
2) the order of the linked libraries is incorrect. Make sure that libraries come after the objects/libraries that use it.

If you need more help you'll have to copy the exact linker command and the exact error message returned from the compiler into this thread.

comput...@gmail.com

unread,
Oct 16, 2015, 6:44:36 AM10/16/15
to Native-Client-Discuss
hi,
thanks for you reply.

my Development Environment:win7 32bit 

1.i compiled ffmpeg (v2.1.3,naclport version ) with MinGW(32bit), used configure "./configure --enable-static --enable-memalign-hack --enable-pthreads",then make & makeinstall ,after about 1 hour i got "libavdevice.a, libavformat.a, libavfilter.a , libavcodec.a,   libswresample.a,  libswscale.a , libavutil.a" and include dir which have some .h files.

2.i used one example "messaging" of papper_43,i changed the nakefile , 1)VALID_TOOLCHAINS := glibc  2)LIBS=avformat avcodec ...

#************************************************************  makefile
VALID_TOOLCHAINS := glibc

NACL_SDK_ROOT ?= $(abspath $(CURDIR)/../../..)

TARGET = messaging

#ARCH = x86_32

include $(NACL_SDK_ROOT)/tools/common.mk


LIBS = avformat avcodec avdevice avfilter avicap32 ws2_32 iconv psapi advapi32 shell32 swresample swscale avutil m pthread ppapi_cpp ppapi 
#LIBS = avcodec avutil swscale avformat pthread ppapi_cpp ppapi 

CFLAGS = -Wall -m32
SOURCES = messaging.cc

# Build rules generated by macros from common.mk:

$(foreach src,$(SOURCES),$(eval $(call COMPILE_RULE,$(src),$(CFLAGS))))

# The PNaCl workflow uses both an unstripped and finalized/stripped binary.
# On NaCl, only produce a stripped binary for Release configs (not Debug).
ifneq (,$(or $(findstring pnacl,$(TOOLCHAIN)),$(findstring Release,$(CONFIG))))
$(eval $(call LINK_RULE,$(TARGET)_unstripped,$(SOURCES),$(LIBS),$(DEPS)))
$(eval $(call STRIP_RULE,$(TARGET),$(TARGET)_unstripped))
else
$(eval $(call LINK_RULE,$(TARGET),$(SOURCES),$(LIBS),$(DEPS)))
endif

$(eval $(call NMF_RULE,$(TARGET),))
#************************************************************
 
3.i copy all the static libs which compiled from ffmpeg to "\pepper_43\lib\glibc_x86_32\Release",becauce VALID_TOOLCHAINS := glibc

4.in the file "messaging.cc" 
i add extern "C"
{
#include "libavcodec/avcodec.h"
#include "libavformat/avformat.h"
#include "libswscale/swscale.h"
}
,and just add one function av_register_all(); 

#***********************************

pp::Var SumArray(const pp::VarArray& array) {
    int32_t result = 0;
    for (uint32_t i = 0, length = array.GetLength(); i < length; ++i) {
      if (!array.Get(i).is_int()) {
        continue;
      }

      result += array.Get(i).AsInt();
    }
    //result += sub(array.Get(0).AsInt(),array.Get(1).AsInt());
av_register_all();
    return pp::Var(result);
  }

#***********************************

5.when "make" , error:  undefined reference to `av_register_all()'

make V=1 ,the result:
python F:\QQMiniDL\naclsdk_win\pepper_43/tools/oshelpers.py mkdir -p glibc/Release/
F:/QQMiniDL/naclsdk_win/pepper_43/toolchain/win_x86_glibc/bin/i686-nacl-g++ -o glibc/Release/messaging_unstripped_x86_32.nexe glibc/Release/messaging_x86_32.o -O2 -Wl,-as-needed -pthread -Wl,-Map,./glibc/Release/messaging_x86_32.map  -LF:\QQMiniDL\naclsdk_win\pepper_43/lib/glibc_x86_32/Release -lavformat -lavcodec -lavdevice -lavfilter -lavicap32 -lws2_32 -liconv -lpsapi -ladvapi32 -lshell32 -lswresample -lswscale -lavutil -lm -lppapi_cpp -lppapi
glibc/Release/messaging_x86_32.o: In function `MessageHandler::SumArray(pp::VarArray const&)':/cygdrive/f/QQMiniDL/naclsdk_win/pepper_43/examples/api/messaging/messaging.cc:65: undefined reference to `av_register_all'

Ben Smith

unread,
Oct 16, 2015, 12:41:34 PM10/16/15
to Native-Client-Discuss
Your problem is in the 1st step. You must use the NaCl compilers to generate NaCl libraries and executables. The library you built will be a Windows library, which is not compatible with Native Client.

You can build ffmpeg with the following command:

bin/naclports install ffmpeg

This will install ffmpeg for the default NaCl toolchain, you will not need to copy the libraries. Please read the naclports instructions here. Note that building on Windows is not supported, but may work in cygwin/mingw. 

comput...@gmail.com

unread,
Oct 19, 2015, 12:35:32 AM10/19/15
to Native-Client-Discuss

hi,Ben
thank you for your reply.
1.I download naclports and build_tools, and set the path of build_tools.when i use command "bin/naclports install ffmpeg" with Cygwin ,it error with  

/cygdrive/c/Users/BAISY/Downloads/naclports/bin
$ naclports install ffmpeg
C:\Python27\python.exe: No module named naclports

i read README.rst , but get nothing about this error , maybe there are some error else,could you tell me the detail step about how to compile ffmpeg naclports .

thanks.

Ben Smith

unread,
Oct 19, 2015, 5:41:53 PM10/19/15
to Native-Client-Discuss
I'm not certain, but maybe you'll need to use cygwin Python too to make this work. bin/naclports is a shell script that runs the python_wrapper script, which modifies the PYTHONPATH environment variable, and runs python. Maybe python.exe is not honoring the changes to PYTHONPATH from cygwin?

Like I said before, building naclports on Windows is not supported, so you'll have to debug most of it yourself. It may be worth your time to set up a Linux VM on your Windows machine instead.

Alexino2

unread,
Oct 20, 2015, 4:33:29 AM10/20/15
to Native-Client-Discuss
Hello,

I don't think this has anything to do with cygwin... I've just reproduce the same bug with Linux, and resolve it.

The problem appears when you use the "-I libavcodec" on the LDFLAGS, I think it uses the packages installed into the toolchain/../usr directory. I don't know why but the bug appears, maybe because the packages have not been cleaned ?

So, in order to resolve it, I just put all the ".a" from the naclports/out in my project and call them with "libavcodec.a", and the bug disappeared.

Hope It's help :)

comput...@gmail.com

unread,
Oct 20, 2015, 5:31:44 AM10/20/15
to Native-Client-Discuss
hi,
when i make file 
BAISY@BAISY-PC /cygdrive/c/Users/BAISY/Downloads/naclports_43/src
$ ./make_all.sh ffmpeg
+ set -e
+ TARGETS=ffmpeg
+ TARGETS=ffmpeg
+ BUILD_FLAGS=--ignore-disabled
+ export BUILD_FLAGS
+ NACL_ARCH=i686
+ TOOLCHAIN=glibc
+ make ffmpeg
make: 'ffmpeg' is up to date.
it is show a error  "make: 'ffmpeg' is up to date.".

when use ununtu vm ,


baisy@ubuntu:~/Desktop/naclports/src$ ./make_all.sh ffmpeg
+ set -e
+ TARGETS=ffmpeg
+ TARGETS=ffmpeg
+ BUILD_FLAGS=--ignore-disabled
+ export BUILD_FLAGS
+ NACL_ARCH=x86_64 TOOLCHAIN=clang-newlib make ffmpeg
make: `ffmpeg' is up to date.
+ NACL_ARCH=x86_64 TOOLCHAIN=glibc make ffmpeg
make: `ffmpeg' is up to date.
+ NACL_ARCH=x86_64 TOOLCHAIN=newlib make ffmpeg
make: `ffmpeg' is up to date.
+ NACL_ARCH=i686 TOOLCHAIN=clang-newlib make ffmpeg
make: `ffmpeg' is up to date.
+ NACL_ARCH=i686 TOOLCHAIN=glibc make ffmpeg
make: `ffmpeg' is up to date.
+ NACL_ARCH=i686 TOOLCHAIN=newlib make ffmpeg
make: `ffmpeg' is up to date.
+ NACL_ARCH=arm TOOLCHAIN=clang-newlib make ffmpeg
make: `ffmpeg' is up to date.
+ NACL_ARCH=arm TOOLCHAIN=newlib make ffmpeg
make: `ffmpeg' is up to date.
+ BIONIC_TOOLCHAIN=/home/baisy/Desktop/nacl_sdk/pepper_43/toolchain/*_arm_bionic
+ shopt -s nullglob
./make_all.sh: 33: ./make_all.sh: shopt: not found
+ [ -n  ]
+ NACL_ARCH=pnacl TOOLCHAIN=pnacl make ffmpeg
make: `ffmpeg' is up to date.
+ [ -n  ]
it is show the same error.

thanks.

comput...@gmail.com

unread,
Oct 20, 2015, 6:53:03 AM10/20/15
to Native-Client-Discuss
hi,
thank you for your reply.
when i compile the ffmpeg,i did not use naclports,i have tried 3 ways,
1) compiled under MinGW
2) compiled under Cygwin
3) compiled with gcc under ubuntu(vm).

but has the same error " undefined reference to `av_register_all()'".

now ,i try to compile ffmpeg with naclports ,but failed.

Alexino2

unread,
Oct 20, 2015, 12:17:29 PM10/20/15
to Native-Client-Discuss
Are you using the LDFLAGS ?

LIBS =  rt ppapi_cpp ppapi
LDFLAGS = libavcodec.a libavformat.a libavcodec.a libavdevice.a libavfilter.a libswresample.a libswscale.a libavutil.a

The packages are in the same directory as my source file

Works for me

comput...@gmail.com

unread,
Oct 20, 2015, 11:40:45 PM10/20/15
to Native-Client-Discuss
hi,
i did not use LDFLAGS before,now i add LDFLAGS ,and get the same error.the error appeared at linking.
i think maybe the static lib which i compiled with MinGW or Unbuntu (did not use naclports ) have some error .

thanks for your reply.

Alexino2

unread,
Oct 27, 2015, 7:16:26 PM10/27/15
to Native-Client-Discuss
Just make sure that the LDFLAGS use the packages copied on your project :

LDFLAGS = myFolder/libavfilter.a myFolder/libavcodec.a ...

The order is important too ! It's work fine for me

comput...@gmail.com

unread,
Oct 28, 2015, 3:17:24 AM10/28/15
to Native-Client-Discuss
hi,
i copied static lib to my project, i think the error may be on to the lib self ,i compiled it use cygWin with out naclports.

taimoo...@gorillabox.net

unread,
Jan 6, 2016, 2:00:56 AM1/6/16
to Native-Client-Discuss
Hello everyone, I have been following this thread, but there seems to be no definitive answer yet.

I am getting the IO error on opening the rtsp stream while using the ffmpeg NACL port in my code. 

I have successfully built the ffmpeg naclport including the following networking flags in the build.sh file for the ffmpeg NaCl port.

--enable network --enable-protocols --enable-demuxer=rtsp --enable-demux=rtp --enable-demuxer=sdp --enable-decoder=h264

Furthermore, I have successfully coded and the linked the ffmpeg NaCl port in my own PNaCl module. I have included the following network permissions in the manifest.json file:


"permissions": [
{
    "socket": [
        "tcp-listen:*:*", 
        "tcp-connect:*:*", 
        "resolve-host:*:*", 
        "udp-bind:*:*", 
        "udp-send-to:*:*"
    ],
}

Now once I run the following code, in PNaCl, the avformat_open_input(...) returns -5 or I/O Error:

 AVFormatContext* formatContext = avformat_alloc_context();

    av_register_all();

    avformat_network_init();

    const char * stream_path = "rtsp://184.72.239.149/vod/mp4:BigBuckBunny_115k.mov";

    int result = avformat_open_input(&formatContext, stream_path ,NULL,NULL);

    if(result< 0){

        PostMessage("input not opened, result: ");

        PostMessage(result);

    }else{

      PostMessage(std::string("input successfully opened"));

    }
What could be a possible solution?

Sam Clegg

unread,
Jan 6, 2016, 7:32:55 PM1/6/16
to native-cli...@googlegroups.com
Are you running this code on main thread? Most the POSIX file and
socket functions in nacl_io will only work on a background thread (If
you use ppapi_simple then your main function is already run on a
background thread).

I thats not the problem I'm afraid you'll need to dig down into the
RTSP transport layer of ffmpeg and do a little debugging. Perhaps see
if there is any extra debug info you have have it print out?

>
>
> On Wednesday, 7 October 2015 12:01:44 UTC+5, Hitesh singla wrote:
>>
>> Hi,
>>
>> I ported the FFMPEG library to PNaCl. While call to "avformat_open_input"
>> function with HLS url, it gives error-- "unable to open file"
>>
>>
>> const char *url
>> =http://cdn-fms.rbs.com.br/vod/hls_sample1_manifest.m3u8;
>> avformat_open_input(&pFormatCtx, url, NULL, NULL)
>>
>>
>>
>> So i tried to mount http link:
>>
>>
>> mount("
>>
>>
>>
>> http://cdn-fms.rbs.com.br", /* source. Use relative URL */
>>
>> "/http", /* target */
>>
>> "httpfs", /* filesystemtype */
>>
>> 0, /* mountflags */
>>
>> ""); /* data */
>>
>> avformat_open_input(&s1,"/http/vod/hls_sample1_manifest.m3u8", NULL,
>> NULL);
>>
>> But no success even after mounting http link with error message: error
>> number "-13", Permission Denied
>>
>>
>> I am able to successfully call avformat_open_input for local mp4 file but
>> unable to do so with http link?
>>
>>
>> Any help will be appreciated..
>>
>>
>> Regards,
>> Hitesh singla
>
> --
> You received this message because you are subscribed to the Google Groups
> "Native-Client-Discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to native-client-di...@googlegroups.com.
> To post to this group, send email to native-cli...@googlegroups.com.
> Visit this group at https://groups.google.com/group/native-client-discuss.
Reply all
Reply to author
Forward
0 new messages